Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!
¡Hola!
Tengo problemas para intentar hacer que las visualizaciones sobre el estado de COVID cambien en varios empleados.
Tengo una tabla de origen SQL como esta:
Índice | Empleado | Fecha | Estado | Región |
1 | Persona A | 16/08/2020 | Sin síntomas | Norte |
2 | Persona B | 16/08/2020 | Sospechoso | Norte |
3 | Persona C | 16/08/2020 | Sin síntomas | Oeste |
4 | Persona A | 17/08/2020 | Sospechoso | Norte |
5 | Persona D | 17/08/2020 | Sin síntomas | Oeste |
6 | Persona E | 17/08/2020 | Sin síntomas | Este |
7 | Persona F | 17/08/2020 | Confirmado | Oeste |
8 | Persona A | 18/08/2020 | Confirmado | Norte |
9 | Persona B | 18/08/2020 | Sospechoso | Norte |
10 | Persona C | 18/08/2020 | Sospechoso | Oeste |
El objetivo es crear objetos visuales de matriz como este para cada región:
Nota de comportamiento: En el ejemplo anterior vemos que el primer día (16/08/2020) sólo tenemos la entrada de empleado "Persona C" en la región oeste, con el estado "Sin síntomas". No tenía una actualización al día siguiente (17/08/2020), por lo que sigue contando como un "Sin síntomas". El día 18/08/2020, sin embargo, su estado se cambia a "Sospechoso".
La tabla de origen va a tener muchos miles de líneas. ¿Cuáles son sus sugerencias?
Gracias de antemano por su tiempo!
Solved! Go to Solution.
Aquí hay una variación que mira la pregunta un poco diferente. A saber, también considera lo que sucede fuera del rango de prueba, especialmente antes. Para ello se añade una medida adicional "Desconocido" para cubrir todos los días antes del primer resultado para cada persona.
Una tabla Dates se utiliza en modo desconectado. Las medidas se añaden a la matriz con "mostrar en filas". Esto da la ventaja añadida de que puede controlar el criterio de ordenación, haciéndolo un poco más lógico. Una fila Totales se puede agregar si se desea, pero no es realmente útil, ya que será la misma para todos los días. A continuación se muestra el ejemplo cuando se filtra "Oeste".
Estas son las medidas:
Unknown :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var s= ADDCOLUMNS(e,"FirstDate",CALCULATE(min(Symptoms[Date]),Filter(allselected(Symptoms),Symptoms[Employee]=[emp])))
var c= ADDCOLUMNS(s,"Check",if([FirstDate]>d,1,0))
return sumx(c,[Check])
No Symptoms :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="No Symptoms",1,0))
return sumx(c,[Check])
Suspect :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="Suspect",1,0))
return sumx(c,[Check])
Confirmed :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="Confirmed",1,0))
return sumx(c,[Check])
Sí, hay espacio para mejorar, seguro...
Aquí hay una manera de hacerlo.
Agregue una tabla desconectada (sin relación con otras tablas), haciendo clic en Nueva tabla en la pestaña Modelado e introduzca la expresión siguiente.
StatusValues - VALUES(Covid[Status])
Haga un objeto visual de matriz con la columna anterior en filas, la columna Fecha en la columna y esta medida en Valores (reemplazar Covid con el nombre real de la tabla).
Recuento de estado más reciente (Latest Status Count)
SUMX (
VALUES ( StatusValues[Status] ),
CALCULAR (
VAR thisstatus ?
SELECTEDVALUE ( StatusValues[Status] )
VAR thisdate ?
MIN ( Covid[Fecha] )
Resumen de VAR ?
ADDCOLUMNS (
TODO ( Covid[Empleado] ),
"último", CALCULATE (
LASTNONBLANKVALUE ( Covid[Fecha], MIN ( Covid[Status] ) ),
TODO ( Covid[Fecha] ),
Covid[Fecha] <- thisdate
)
)
devolución
COUNTROWS ( FILTRO ( resumen, [último] - thisstatus ) ) + 0
)
)
Si esto funciona para usted, márquelo como la solución. Los elogios también son apreciados. Por favor, avísame si no.
saludos
palmadita
To learn more about Power BI, follow me on Twitter or subscribe on YouTube.
Aquí hay una variación que mira la pregunta un poco diferente. A saber, también considera lo que sucede fuera del rango de prueba, especialmente antes. Para ello se añade una medida adicional "Desconocido" para cubrir todos los días antes del primer resultado para cada persona.
Una tabla Dates se utiliza en modo desconectado. Las medidas se añaden a la matriz con "mostrar en filas". Esto da la ventaja añadida de que puede controlar el criterio de ordenación, haciéndolo un poco más lógico. Una fila Totales se puede agregar si se desea, pero no es realmente útil, ya que será la misma para todos los días. A continuación se muestra el ejemplo cuando se filtra "Oeste".
Estas son las medidas:
Unknown :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var s= ADDCOLUMNS(e,"FirstDate",CALCULATE(min(Symptoms[Date]),Filter(allselected(Symptoms),Symptoms[Employee]=[emp])))
var c= ADDCOLUMNS(s,"Check",if([FirstDate]>d,1,0))
return sumx(c,[Check])
No Symptoms :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="No Symptoms",1,0))
return sumx(c,[Check])
Suspect :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="Suspect",1,0))
return sumx(c,[Check])
Confirmed :=
var d = max(SymptomDates[Date])
var e = SELECTCOLUMNS(allselected(Symptoms[Employee]),"emp",Symptoms[Employee])
var ld= ADDCOLUMNS(e,"LastDate",CALCULATE(max(Symptoms[Date]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]<=d && Symptoms[Status] in {"No Symptoms","Suspect","Confirmed"})))
var c= ADDCOLUMNS(ld,"Check",if(CALCULATE(max(Symptoms[Status]),filter(ALLSELECTED(Symptoms),Symptoms[Employee]=[emp] && Symptoms[Date]=[LastDate]))="Confirmed",1,0))
return sumx(c,[Check])
Sí, hay espacio para mejorar, seguro...
Gracias @lbendlin y @mahoneypat por las respuestas.
Apliqué la solución de Ibedlin, pero no lo hago bien. Mi matriz final siempre muestra el número del día final para todos los días, como se ve a continuación:
He comprobado dos veces el código de la medida y la tabla de fechas (desconectada). Primero fui para CALENDARAUTO() y luego CALENDAR(FIRSTDATE(Symptoms[Date]),LASTDATE(Symptoms[Date])). ¿Tiene alguna sugerencia sobre este problema?
He subido el archivo .pbix aquí: https://drive.google.com/file/d/153iCRT5u80nXolMgY1jMBcXFlRoYgyIE/view?usp=sharing
¡Gracias a todos!
Usó el campo de fecha incorrecto en el objeto visual. Debe ser SymptomDates[Date], no Symptoms[Date].
¡Muchas gracias!
Marcado como solución.
Un enfoque es llenar los huecos entre las mediciones. Utilice el patrón CROSSFILTER(,,NONE) entre la tabla de hechos y la tabla de fechas y una medida base LASTNONBLANKVALUE para rellenarlas. Ese enfoque se escala bien.