The ultimate Fabric, Power BI, SQL, and AI community-led learning event. Save €200 with code FABCOMM.
Get registeredEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Hola a todos
Probé la fórmula de esta solución https://community.powerbi.com/t5/Desktop/Calculated-Column-time-between-events-in-different-rows/m-p... sobre mi situación porque parece la misma intención, pero al adaptar la fórmula sólo funcionó en parte. Lo raro es que de vez en cuando calcula el tiempo entre los acontecimientos, pero la mayoría de las veces no lo hace. (en la tabla que se muestra a continuación sólo calculó el último evento).
Mi situación se muestra a continuación. Quiero calcular el tiempo entre, cuando se produce un evento ''Gekomen'' y cuando los eventos desaparecen ''Gegaan''', que se muestra en la fila Estado. Los eventos tienen un ID que está conectado por un tipo de evento (Estado), por lo que puede ocurrir varias veces, quiero saber el tiempo entre el estado (''gegaan'' y ''gekomen''). (la parte difícil es que todos los valores de evento aparecen entre sí y los eventos pueden aparecer y desaparecer en la misma fecha y hora, también los eventos pueden ocurrir varias veces en poco tiempo. ¡Espero que puedas ayudarme!
Duración del índice de fecha y hora del ID de estado
Pasado 1-2-2021 09:34 10 7
Pasado 1-2-2021 09:34 637 7
Pasado 1-2-2021 09:34 641 3
Pasado 1-2-2021 09:34 641 3
Pasado 1-2-2021 09:35 637 9
Pasado 1-2-2021 09:35 10 9
Pasado 1-2-2021 09:37 635 1
Pasado 1-2-2021 09:37 626 3
Vino 1-2-2021 09:37 635 1
Vino 1-2-2021 09:37 635 1
Pasado 1-2-2021 09:37 635 1
Pasado 1-2-2021 09:37 626 3
Vino 1-2-2021 09:37 655 1
Pasado 1-2-2021 09:37 655 1
Vino 1-2-2021 09:38 656 1
Pasado 1-2-2021 09:39 656 2 1
(Los datos mostrados son igual de refference para los datos reales)
Utilicé la fórmula del post en el enlace.
¡Gracias por ayudarme!
Solved! Go to Solution.
No @WmUit,
De hecho, lo que creé antes es una medida no una columna calculada... He creado un archivo pbix de ejemplo (ver archivo adjunto) para usted, por favor compruebe si eso es lo que desea.
1. Cree una columna calculada para obtener el rango por ID
Index =
RANKX (
FILTER (
ALL ( 'Data' ),
'Data'[Status]
IN { "Gegaan", "Gekomen" }
&& 'Data'[ID] = EARLIER ( 'Data'[ID] )
),
'Data'[Date and Time],
,
ASC,
DENSE
)
2. Cree una medida o columna calculada para obtener la duración
Medida:
Measure Duration =
VAR _gektime =
CALCULATE (
MAX ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = SELECTEDVALUE ( 'Data'[ID] )
&& 'Data'[Status] = "Gekomen"
&& 'Data'[Index] <= SELECTEDVALUE ( 'Data'[Index] )
)
)
VAR _duration =
DATEDIFF (
IF ( SELECTEDVALUE ( 'Data'[Status] ) = "Gegaan", _gektime, BLANK () ),
SELECTEDVALUE ( 'Data'[Date and Time] ),
SECOND
)
VAR _hours =
INT ( _duration / 3600 )
VAR _minutes =
INT ( MOD ( _duration - ( _hours * 3600 ), 3600 ) / 60 )
VAR _seconds =
ROUNDUP ( MOD ( MOD ( _duration - ( _hours * 3600 ), 3600 ), 60 ), 0 )
VAR _hh =
IF (
LEN ( _hours ) = 1,
CONCATENATE ( "0", _hours ),
CONCATENATE ( "", _hours )
)
VAR _mm =
IF (
LEN ( _minutes ) = 1,
CONCATENATE ( "0", _minutes ),
CONCATENATE ( "", _minutes )
)
VAR _ss =
IF (
LEN ( _seconds ) = 1,
CONCATENATE ( "0", _seconds ),
CONCATENATE ( "", _seconds )
)
RETURN
IF (
ISBLANK ( _duration ),
BLANK (),
CONCATENATE (
_hh,
CONCATENATE ( ":", CONCATENATE ( _mm, CONCATENATE ( ":", _ss ) ) )
)
)
O columna calculada:
Calculated Column Duration =
VAR _gektime =
CALCULATE (
MAX ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = EARLIER ( 'Data'[ID] )
&& 'Data'[Status] = "Gekomen"
&& 'Data'[Index] <= EARLIER ( 'Data'[Index] )
)
)
VAR _duration =
DATEDIFF (
IF ( 'Data'[Status] = "Gegaan", _gektime, BLANK () ),
'Data'[Date and Time],
SECOND
)
VAR _hours =
INT ( _duration / 3600 )
VAR _minutes =
INT ( MOD ( _duration - ( _hours * 3600 ), 3600 ) / 60 )
VAR _seconds =
ROUNDUP ( MOD ( MOD ( _duration - ( _hours * 3600 ), 3600 ), 60 ), 0 )
VAR _hh =
IF (
LEN ( _hours ) = 1,
CONCATENATE ( "0", _hours ),
CONCATENATE ( "", _hours )
)
VAR _mm =
IF (
LEN ( _minutes ) = 1,
CONCATENATE ( "0", _minutes ),
CONCATENATE ( "", _minutes )
)
VAR _ss =
IF (
LEN ( _seconds ) = 1,
CONCATENATE ( "0", _seconds ),
CONCATENATE ( "", _seconds )
)
RETURN
IF (
ISBLANK ( _duration ),
BLANK (),
CONCATENATE (
_hh,
CONCATENATE ( ":", CONCATENATE ( _mm, CONCATENATE ( ":", _ss ) ) )
)
)
Saludos
No @WmUit,
Puede crear una medida como se muestra a continuación:
Duration =
VAR _Gekomen =
CALCULATE (
MAX ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = SELECTEDVALUE ( 'Data'[ID] )
&& 'Data'[Status] = "Gekomen"
)
)
VAR _Gegaan =
CALCULATE (
MIN ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = SELECTEDVALUE ( 'Data'[ID] )
&& 'Data'[Status] = "Gegaan"
&& 'Data'[Date and Time] > _Gekomen
)
)
RETURN
DATEDIFF ( _Gekomen, _Gegaan, MINUTE )
Si el anterior no funciona, proporcione su resultado esperado con más detalles. Gracias.
Saludos
Hola @yingyinr , Gracias por responder, Lo anterior no está funcionando. Para explicar mi resultado esperado hice una explicación de Excel. El estado es un evento que muestra cuándo y evento se está produciendo cuando se ha ido, por lo que en esta situación 'gegaan' indica cuando el evento se está disipando en ''gekomen'' es cuando comienza un evento. El ID es un tipo de evento. Quiero saber cuánto tiempo está ocurriendo un evento. La nota al revés es que cada evento se puede ocurrir varias veces y los eventos se están produciendo a través de una y otra. Necesito una Fórmula que calcule el tiempo (gegaan-gekomen) por evento. Así que puedo ver por ID cuánto tiempo ocurrió.
Cuando mi resultado esperado aún no esté claro, no dudes en preguntar a 🙂
Saludos
Wesley
No @WmUit,
Actualicé la fórmula de duración de la medida como se indica a continuación, pero obtendrá un resultado incorrecto cuando haya varios status (por ejemplo: id 210).... ¿Podría proporcionar la lógica de cálculo sobre este escenario?
Duration =
var _selid=SELECTEDVALUE('Data'[ID])
VAR _gekindex =
CALCULATE (
MIN( 'Data'[Index] ),
FILTER (
ALLSELECTED( 'Data' ),
'Data'[ID] = _selid
&& 'Data'[Status] = "Gegaan"
)
)
VAR _gegaindex =
CALCULATE (
MAX( 'Data'[Index] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = _selid
&& 'Data'[Status] = "Gekomen"
&& SELECTEDVALUE('Data'[Index]) >=_gekindex
)
)
var _gegatime=CALCULATE(max('Data'[Date and Time]),FILTER(ALLSELECTED( 'Data' ),'Data'[ID]=_selid&&'Data'[Index]=_gegaindex))
RETURN
DATEDIFF ( if(SELECTEDVALUE('Data'[Status] )= "Gegaan",_gegatime,BLANK()),SELECTEDVALUE('Data'[Date and Time]), MINUTE )
Saludos
Hola @yingyinr muchas gracias por su reacción,
Probé tu fórmula pero no obtequé ningún resultado, Picture está abajo. Para el número de índice utilicé una fórmula que se publicó en otra discusión. El Estado puede ocurrir varias veces en un corto período, es una indicación de un evento a iniciar, por lo que ''Gekomen'' significa un evento iniciado y ''Gegaan'' significa que el evento ha terminado, por lo que el cálculo lógico es El final (gegaan) menos el comienzo del evento (gekomen). Así que ''gegaan' y ''Gekomen'' son los mismos que Start and End, como en la imagen dada que envías con DNI; 210, el primer evento ocurrió de 11:58-12:01 y el segundo evento (mismo ID) ocurrió de 12:04-12:05.
Come=Evento de inicio
Gone=Fin del evento
Probé tu fórmula pero no obtení ningún cálculo, hice algo malo, que se muestra en la imagen.
No @WmUit,
De hecho, lo que creé antes es una medida no una columna calculada... He creado un archivo pbix de ejemplo (ver archivo adjunto) para usted, por favor compruebe si eso es lo que desea.
1. Cree una columna calculada para obtener el rango por ID
Index =
RANKX (
FILTER (
ALL ( 'Data' ),
'Data'[Status]
IN { "Gegaan", "Gekomen" }
&& 'Data'[ID] = EARLIER ( 'Data'[ID] )
),
'Data'[Date and Time],
,
ASC,
DENSE
)
2. Cree una medida o columna calculada para obtener la duración
Medida:
Measure Duration =
VAR _gektime =
CALCULATE (
MAX ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = SELECTEDVALUE ( 'Data'[ID] )
&& 'Data'[Status] = "Gekomen"
&& 'Data'[Index] <= SELECTEDVALUE ( 'Data'[Index] )
)
)
VAR _duration =
DATEDIFF (
IF ( SELECTEDVALUE ( 'Data'[Status] ) = "Gegaan", _gektime, BLANK () ),
SELECTEDVALUE ( 'Data'[Date and Time] ),
SECOND
)
VAR _hours =
INT ( _duration / 3600 )
VAR _minutes =
INT ( MOD ( _duration - ( _hours * 3600 ), 3600 ) / 60 )
VAR _seconds =
ROUNDUP ( MOD ( MOD ( _duration - ( _hours * 3600 ), 3600 ), 60 ), 0 )
VAR _hh =
IF (
LEN ( _hours ) = 1,
CONCATENATE ( "0", _hours ),
CONCATENATE ( "", _hours )
)
VAR _mm =
IF (
LEN ( _minutes ) = 1,
CONCATENATE ( "0", _minutes ),
CONCATENATE ( "", _minutes )
)
VAR _ss =
IF (
LEN ( _seconds ) = 1,
CONCATENATE ( "0", _seconds ),
CONCATENATE ( "", _seconds )
)
RETURN
IF (
ISBLANK ( _duration ),
BLANK (),
CONCATENATE (
_hh,
CONCATENATE ( ":", CONCATENATE ( _mm, CONCATENATE ( ":", _ss ) ) )
)
)
O columna calculada:
Calculated Column Duration =
VAR _gektime =
CALCULATE (
MAX ( 'Data'[Date and Time] ),
FILTER (
ALLSELECTED ( 'Data' ),
'Data'[ID] = EARLIER ( 'Data'[ID] )
&& 'Data'[Status] = "Gekomen"
&& 'Data'[Index] <= EARLIER ( 'Data'[Index] )
)
)
VAR _duration =
DATEDIFF (
IF ( 'Data'[Status] = "Gegaan", _gektime, BLANK () ),
'Data'[Date and Time],
SECOND
)
VAR _hours =
INT ( _duration / 3600 )
VAR _minutes =
INT ( MOD ( _duration - ( _hours * 3600 ), 3600 ) / 60 )
VAR _seconds =
ROUNDUP ( MOD ( MOD ( _duration - ( _hours * 3600 ), 3600 ), 60 ), 0 )
VAR _hh =
IF (
LEN ( _hours ) = 1,
CONCATENATE ( "0", _hours ),
CONCATENATE ( "", _hours )
)
VAR _mm =
IF (
LEN ( _minutes ) = 1,
CONCATENATE ( "0", _minutes ),
CONCATENATE ( "", _minutes )
)
VAR _ss =
IF (
LEN ( _seconds ) = 1,
CONCATENATE ( "0", _seconds ),
CONCATENATE ( "", _seconds )
)
RETURN
IF (
ISBLANK ( _duration ),
BLANK (),
CONCATENATE (
_hh,
CONCATENATE ( ":", CONCATENATE ( _mm, CONCATENATE ( ":", _ss ) ) )
)
)
Saludos
Hola @yingyinr,Muchas gracias por su tiempo y solución, está funcionando perfectamente. Elegí la columna calculada para facilitar la visión general y los tiempos de comprobación. Gracias de nuevo por el tiempo y el esfuerzo.
Saludos
Wesley