- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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
grupo | tipo | Hora de inicio | Hora final |
10001 | A | 2/11/21 8:12:03 | 2/11/21 8:12:23 |
10001 | A | 2/11/21 8:12:45 | 2/11/21 8:14:59 |
10002 | B | 2/11/21 9:15:05 | 2/11/21 9:16:20 |
10002 | B | 2/11/21 9:16:25 | 2/11/21 9:16:50 |
10002 | B | 2/11/21 9:16:55 | 2/11/21 9:17:10 |
10002 | B | 2/11/21 9:17:17 | 2/11/21 9:17:46 |
10003 | C | 2/11/21 9:18:03 | 2/11/21 9:18:30 |
10003 | C | 2/11/21 9:18:34 | 2/11/21 9:18:58 |
10003 | C | 2/11/21 9:19:02 | 2/11/21 9:19:58 |
10003 | C | 2/11/21 9:20:06 | 2/11/21 9:20:47 |
10004 | A | 2/11/21 9:21:06 | 2/11/21 9:21:48 |
10004 | A | 2/11/21 9:21:56 | 2/11/21 9:22:10 |
10004 | A | 2/11/21 9:22:13 | 2/11/21 9:22:37 |
La matriz de salida deseada tendría un aspecto similar al siguiente:
tipo | Duración media (segundos) |
A | 133.5 |
B | 161 |
C | 164 |
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?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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:
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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:
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

@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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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 )
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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 )
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

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:

Helpful resources
Subject | Author | Posted | |
---|---|---|---|
02-15-2021 06:46 AM | |||
07-17-2021 10:44 PM | |||
08-14-2021 04:33 PM | |||
01-27-2022 06:24 AM | |||
01-14-2021 03:52 PM |