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

Be one of the first to start using Fabric Databases. View on-demand sessions with database experts and the Microsoft product team to learn just how easy it is to get started. Watch now

Reply
Syndicate_Admin
Administrator
Administrator

DATEDIFF por grupo

Tengo un conjunto de datos como se muestra a continuación que me gustaría calcular la duración promedio de cada tipo en función de la diferencia entre las horas de inicio y finalización de cada grupo.

Datos de ejemplo

grupotipoHora de inicioHora final
10001A2/11/21 8:12:032/11/21 8:12:23
10001A2/11/21 8:12:452/11/21 8:14:59
10002B2/11/21 9:15:052/11/21 9:16:20
10002B2/11/21 9:16:252/11/21 9:16:50
10002B2/11/21 9:16:552/11/21 9:17:10
10002B2/11/21 9:17:172/11/21 9:17:46
10003C2/11/21 9:18:032/11/21 9:18:30
10003C2/11/21 9:18:342/11/21 9:18:58
10003C2/11/21 9:19:022/11/21 9:19:58
10003C2/11/21 9:20:062/11/21 9:20:47
10004A2/11/21 9:21:062/11/21 9:21:48
10004A2/11/21 9:21:562/11/21 9:22:10
10004A2/11/21 9:22:132/11/21 9:22:37


La matriz de salida deseada tendría un aspecto similar al siguiente:

tipoDuración media (segundos)
A133.5
B161
C164


He podido hacer una medida DAX que calcula la diferencia entre la primera ocurrencia de A y la última ocurrencia de A, etc., pero no he podido agrupar la medida. La medida:

PartFabTime = CALCULATE ( DATEDIFF ( MIN (  Log[StartTime] ), MAX ( Log[EndTime]) , HOUR ) )


¿Alguien tiene alguna idea?

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

No @MichaelBalla

Crear columna como:

Duration = 
CALCULATE(DATEDIFF(MAX('Log'[StartTime]),MAX('Log'[EndTime]),SECOND))

Cree una medida como:

PartFabTime = 
AVERAGEX(
    FILTER(
        ALL('Log'),
        'Log'[Type]=MAX('Log'[Type])
    ),
    'Log'[Duration]
)

Aquí está la salida:

vxulinmstf_0-1625124938042.png

Si todavía tienes alguna pregunta, por favor no dudes en hacérmelo saber.

Saludos

enlace

¿Es esa la respuesta que estás buscando? Si este post ayuda, entonces por favor considere Aceptarlo como la solución. Realmente apreciar!

View solution in original post

7 REPLIES 7
Syndicate_Admin
Administrator
Administrator

No @MichaelBalla

Crear columna como:

Duration = 
CALCULATE(DATEDIFF(MAX('Log'[StartTime]),MAX('Log'[EndTime]),SECOND))

Cree una medida como:

PartFabTime = 
AVERAGEX(
    FILTER(
        ALL('Log'),
        'Log'[Type]=MAX('Log'[Type])
    ),
    'Log'[Duration]
)

Aquí está la salida:

vxulinmstf_0-1625124938042.png

Si todavía tienes alguna pregunta, por favor no dudes en hacérmelo saber.

Saludos

enlace

¿Es esa la respuesta que estás buscando? Si este post ayuda, entonces por favor considere Aceptarlo como la solución. Realmente apreciar!

Syndicate_Admin
Administrator
Administrator

Esto es más fácil si agrega una columna calculada en la tabla Log

Seconds = DATEDIFF (  Log[StartTime], Log[EndTime] , SECOND )

A continuación, puede escribir una medida que haga referencia a esa columna:

CALCULATE ( AVERAGE ( Log[Seconds] ), ALLEXCEPT ( Log, Log[Type] ) )

De lo contrario, debe realizar ese cálculo dentro de un iterador, que no es particularmente eficaz desde el cálculo.

@AlexisOlson He intentado algo similar, sin embargo, la columna calculada solo calculará el promedio de cada fila y no tendrá en cuenta el espacio de tiempo entre las filas.

Ah ok. Eso cambia el requisito ya que ya no es realmente un "promedio".

¿Qué tal esto?

SecondsPerType =
VAR CurrType = VALUES ( Log[Type] )
VAR StartTime = CALCULATE ( MAX ( Log[StartTime] ), Log[Type] IN CurrType )
VAR EndTime = CALCULATE ( MAX ( Log[EndTime] ), Log[Type] IN CurrType )
RETURN
    DATEDIFF ( StartTime, EndTime, SECOND )

Así que tomé su ejemplo, que no funcionó inmediatamente, e intenté modificarlo un poco para ver si podía hacerlo funcionar, pero sigo obteniendo esta salida:

entrada:

The function expects a table expression for argument '', but a string or numeric expression was used.

Salida:

Multiple arguements aren't allowed in the ALLSELECTED function when the first argument is a table reference.

¿Alguna idea? Por alguna razón creo que está esperando que el CurrType sea una tabla?

Sí, lo escribí para que CurrType pudiera ser varios valores (para que los totales tuvieran más probabilidades de funcionar como se esperaba). Si no le importan los totales y usa SELECTEDVALUE, que proporciona un solo valor en lugar de una lista de valores, entonces tendría algo como esto:

SecondsPerType =
VAR CurrType = SELECTEDVALUE ( Log[Type] )
VAR StartTime = CALCULATE ( MAX ( Log[StartTime] ), ALLSELECTED ( Log ), Log[Type] = CurrType )
VAR EndTime = CALCULATE ( MAX ( Log[EndTime] ), ALLSELECTED ( Log ), Log[Type] = CurrType )
RETURN
    DATEDIFF ( StartTime, EndTime, SECOND )

Ah, solo estaba probando diferentes funciones para ver si podía hacerlo funcionar. Una lista de valores es lo que esperaría como resultado, así que la cambié de nuevo a VALUES. Ahora devuelve un valor de 0 para cada fila y no hay ningún error. ¿Alguna idea?

editar:

Después de experimentar un poco, está calculando la diferencia entre la hora de inicio más reciente y la hora de finalización más reciente, en lugar de hacerlo por grupo.

Archivo PBIX:

https://skyviewglass-my.sharepoint.com/:u:/p/michael/EShyNzYS1qVPhYhotAhceBYBtAR5_9sX6tzx1NkgDzbvPQ?...

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!

ArunFabCon

Microsoft Fabric Community Conference 2025

Arun Ulag shares exciting details about the Microsoft Fabric Conference 2025, which will be held in Las Vegas, NV.

December 2024

A Year in Review - December 2024

Find out what content was popular in the Fabric community during 2024.

Top Solution Authors
Top Kudoed Authors