Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
thomasgcoelho
Frequent Visitor

Sumar el estado actual por día

¡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:

ÍndiceEmpleadoFechaEstadoRegión
1Persona A16/08/2020Sin síntomasNorte
2Persona B16/08/2020SospechosoNorte
3Persona C16/08/2020Sin síntomasOeste
4Persona A17/08/2020SospechosoNorte
5Persona D17/08/2020Sin síntomasOeste
6Persona E17/08/2020Sin síntomasEste
7Persona F17/08/2020ConfirmadoOeste
8Persona A18/08/2020ConfirmadoNorte
9Persona B18/08/2020SospechosoNorte
10Persona C18/08/2020SospechosoOeste

El objetivo es crear objetos visuales de matriz como este para cada región:

thomasgcoelho_1-1597808538665.png

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!

1 ACCEPTED 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".

lbendlin_0-1597890736183.png

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...

View solution in original post

6 REPLIES 6
mahoneypat
Employee
Employee

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





Did I answer your question? Mark my post as a solution! Kudos are also appreciated!

To learn more about Power BI, follow me on Twitter or subscribe on YouTube.


@mahoneypa HoosierBI 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".

lbendlin_0-1597890736183.png

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:

thomasgcoelho_0-1598412433265.png

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.

lbendlin
Super User
Super User

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.

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors