March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early bird discount ends December 31.
Register NowBe 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
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.
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.
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!
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!
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:
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!
Arun Ulag shares exciting details about the Microsoft Fabric Conference 2025, which will be held in Las Vegas, NV.