Ayuda con la diferencia de tiempo entre varias filas

Un usuario Pregunto ✅

artillero

Hola a todos,

Estoy buscando ayuda para calcular la diferencia de tiempo entre 2 fechas para valores en diferentes intervalos a lo largo de mis datos. La muestra de los datos se encuentra a continuación.

Ejemplo: Necesito encontrar la duración del tiempo entre el Usuario ABC = Recuento de licencias 1 y el Usuario ABC = Recuento de licencias -1, la duración del tiempo entre el Usuario XYZ = Recuento de licencias 1 y el Usuario XYZ = Recuento de licencias -1.

Como puede ver en el ADE de usuario, puede haber una cantidad de filas entre un recuento de licencias = 1 y = -1 para el mismo usuario.

Cualquier ayuda con mucho gusto, gracias.

Marca de tiempo (UTC) Archivo adquirido Recuento de licencias Usuario
18/12/2017 0:01 Adquirido 1 A B C
18/12/2017 0:13 Adquirido 1 XYZ
18/12/2017 0:20 Publicado -1 A B C
18/12/2017 0:31 Adquirido 1 ADE
18/12/2017 0:31 Publicado -1 XYZ
18/12/2017 0:37 Adquirido 1 Logística de Amazon
18/12/2017 0:38 Publicado -1 Logística de Amazon
18/12/2017 0:41 Publicado -1 ANR
18/12/2017 0:41 Adquirido 1 ANR
18/12/2017 0:52 Publicado -1 ADE

Zubair_Muhammad

En respuesta a artillero

Hola @gunner

Aquí va

Time Difference =
VAR TimeAtAcquisition =
    CALCULATE (
        FIRSTNONBLANK ( 'LicenseUsage'[Timestamp (UTC)], 1 ),
        FILTER (
            ALLEXCEPT ( 'LicenseUsage', 'LicenseUsage'[User] ),
            'LicenseUsage'[Action] = 1
        )
    )
VAR TimeAtRelease =
    CALCULATE (
        FIRSTNONBLANK ( 'LicenseUsage'[Timestamp (UTC)], 1 ),
        FILTER (
            ALLEXCEPT ( 'LicenseUsage', 'LicenseUsage'[User] ),
            'LicenseUsage'[Action] = -1
        )
    )
RETURN
    DATEDIFF ( TimeAtAcquisition, TimeAtRelease, MINUTE )

Zubair_Muhammad

Hola @gunner

Prueba esta columna

Time Difference =
VAR TimeAtAcquisition =
    CALCULATE (
        VALUES ( Table1[Timestamp (UTC)] ),
        FILTER ( ALLEXCEPT ( Table1, Table1[User] ), Table1[License Count] = 1 )
    )
VAR TimeAtRelease =
    CALCULATE (
        VALUES ( Table1[Timestamp (UTC)] ),
        FILTER ( ALLEXCEPT ( Table1, Table1[User] ), Table1[License Count] = -1 )
    )
RETURN
    DATEDIFF ( TimeAtAcquisition, TimeAtRelease, MINUTE )

artillero

En respuesta a Zubair_Muhammad

Gracias por su respuesta. Creo que definitivamente funcionará, excepto que mi columna de marca de tiempo tiene algunos valores duplicados. Ejemplo, 2 usuarios pueden adquirir una licencia al mismo tiempo. Esto conduce a entradas duplicadas en la columna de marca de tiempo y obtengo ‘Se proporcionó una tabla de valores múltiples donde se esperaba un valor único’ al aplicar su consulta de columna.

¿Hay alguna manera de lidiar con esto?

Gracias de nuevo.

Zubair_Muhammad

En respuesta a artillero

Hola
Reemplace VALORES (tabla 1[timestamp]) con firstno en blanco (table1[timestamp], 1)

Zubair_Muhammad

En respuesta a Zubair_Muhammad

Hola
Por favor, reemplace en ambas variables

Estoy en el móvil, así que no pude darte el código completo. Disculpas

artillero

En respuesta a Zubair_Muhammad

Gracias. ¿Puede proporcionar el código cuando tenga tiempo? Cambié los valores como sugirió, pero ahora aparece un error de sintaxis para que FILTER sea incorrecto. Estoy usando:

Diferencia horaria =
Tiempo VAR en la adquisición =
CALCULAR (
FIRSTNONBLANK ( ‘Uso de licencia'[Timestamp (UTC)],1)
FILTRO ( TODO EXCEPTO (‘Uso de licencia’, ‘Uso de licencia'[User] ), ‘Uso de licencia'[Action] = 1 )
)
Tiempo VAR en liberación =
CALCULAR (
PRIMER NO BLANCO (‘Uso de licencia'[Timestamp (UTC)],1 )
FILTRO ( TODO EXCEPTO ( ‘Uso de licencia’, ‘Uso de licencia'[User]), ‘Uso de licencia'[Action] = -1 )
)
REGRESO
DATEDIFF (Tiempo de adquisición, Tiempo de liberación, MINUTO)

Gracias

Zubair_Muhammad

En respuesta a artillero

Hola @gunner

Aquí va

Time Difference =
VAR TimeAtAcquisition =
    CALCULATE (
        FIRSTNONBLANK ( 'LicenseUsage'[Timestamp (UTC)], 1 ),
        FILTER (
            ALLEXCEPT ( 'LicenseUsage', 'LicenseUsage'[User] ),
            'LicenseUsage'[Action] = 1
        )
    )
VAR TimeAtRelease =
    CALCULATE (
        FIRSTNONBLANK ( 'LicenseUsage'[Timestamp (UTC)], 1 ),
        FILTER (
            ALLEXCEPT ( 'LicenseUsage', 'LicenseUsage'[User] ),
            'LicenseUsage'[Action] = -1
        )
    )
RETURN
    DATEDIFF ( TimeAtAcquisition, TimeAtRelease, MINUTE )

artillero

En respuesta a Zubair_Muhammad

Gracias, creo que estoy llegando a algún lado ahora. Creo que me estoy perdiendo solo un paso vital y creo que he terminado. Ver mis resultados:

DATEDIFF (TimeAtAcquisition, TimeAtRelease, MINUTE) solo devuelve la diferencia entre la primera fila de adquiridos y la primera fila de liberados. Puse un campo de índice allí solo para rastrear las acciones adquiridas/liberadas. En cada caso, obtengo los resultados del Índice 2-1, que es 1 minuto usando el ejemplo a continuación.

Tipo de evento Fecha y hora ID de usuario Índice Diferencia horaria
Adquirido 12/05/2017 21:01 a B C 1 1
Adquirido 12/06/2017 18:52 a B C 3 1
Adquirido 12/06/2017 21:29 a B C 5 1
Adquirido 12/7/2017 0:45 a B C 7 1
Publicado 12/05/2017 21:02 a B C 2 1
Publicado 12/06/2017 19:31 a B C 4 1
Publicado 12/06/2017 21:30 a B C 6 1
Publicado 12/7/2017 0:53 a B C 8 1

Otro ejemplo. Puede ver que la diferencia de tiempo ha funcionado para la primera adquisición/liberación y ha devuelto 3 minutos, pero ha llevado ese valor a todas las filas.

Tipo de evento Fecha y hora ID de usuario Índice Diferencia horaria
Adquirido 12/11/2017 1:03 bm11 1 3
Adquirido 12/11/2017 1:06 bm11 3 3
Adquirido 12/11/2017 1:31 bm11 5 3
Publicado 12/11/2017 1:06 bm11 2 3
Publicado 12/11/2017 1:31 bm11 4 3
Publicado 12/11/2017 2:31 bm11 6 3

Cualquier idea apreciada.

Zubair_Muhammad

En respuesta a artillero

@artillero

¿Hay una columna de índice en su tabla original con el mismo patrón que ha mencionado anteriormente?

artillero

En respuesta a Zubair_Muhammad

Hola. Sí, hay una columna de índice. Gracias a su código logré que funcionara a un nivel utilizable. Hay algunos casos en los que la licencia adquirida y la acción liberada pueden ocurrir para el mismo usuario exactamente al mismo tiempo que el segundo. Es de suponer que la aplicación se cierra. En este caso, el índice asigna a ambos valores un 1 e intenta restar lo requerido de lo adquirido y luego da un número -ve. Eso está bien, ya que puedo filtrar el informe para mostrar solo 0 o más. Los cálculos de diferencia horaria funcionan muy bien. Gracias por su ayuda, no podría haber hecho esto sin su guía.

chispabymahi

En respuesta a artillero

Hola

¿Puede compartir el código que usó para calcular la diferencia con el índice ya que tengo el mismo requisito?

artillero

En respuesta a chispabymahi

Hola chicos, anteriormente había marcado esto como resuelto, pero he notado algo que está alterando mis cálculos. Estoy usando un campo de índice para calcular la diferencia entre los tiempos de adquisición y lanzamiento de un artículo. El lenguaje de consulta para el índice es anterior en este hilo y funciona bien hasta que un elemento se adquiere y se libera exactamente al mismo tiempo para un usuario. El Índice asigna a ambas acciones el mismo valor, lo que descarta los cálculos de forma bastante sustancial.

Ejemplo en la imagen a continuación, donde las últimas 2 líneas de un artículo se adquieren y liberan al mismo tiempo y a ambos se les asigna el mismo valor de índice (17). Idealmente, quiero que el índice asigne el valor de 17 y 18, o simplemente ignore esto por completo, ya que el valor de tiempo correspondiente sería cero. Lo probé eliminando manualmente esas 2 últimas entradas de la fuente de datos y los cálculos son perfectos. Necesito que se eliminen los mismos valores o que se me asigne el valor de índice correcto. Gracias si puedes ayudar.

Consulta de índice:

Index = 
IF (
    OR ( 'OpenLicenseUsage-9601427'[Action] = "Released", 'OpenLicenseUsage-9601427'[Action] = "Acquired" ),
    RANKX (
        FILTER (
            ALL ( 'OpenLicenseUsage-9601427'),
            OR ( 'OpenLicenseUsage-9601427'[Action] = "Released", 'OpenLicenseUsage-9601427'[Action] = "Acquired" )
                && 'OpenLicenseUsage-9601427'[User] = EARLIER ( 'OpenLicenseUsage-9601427'[User] )
        ),
        'OpenLicenseUsage-9601427'[Timestamp (UTC)],
        ,
        asc
    )
)

Capturar.JPG

quyennguyen

En respuesta a artillero

Hola,

Ante todo gracias por esta información.

¿Podría compartir la fórmula donde también incluyó la columna ÍNDICE?

Y para su problema de índice, si su campo de tiempo tiene milisegundos, tal vez esa sea una forma de hacerlo. único.

Atentamente,

Quyen

artillero

En respuesta a chispabymahi

Hola chicos, anteriormente había marcado esto como resuelto, pero he notado algo que está alterando mis cálculos. Estoy usando un campo de índice para calcular la diferencia entre los tiempos de adquisición y lanzamiento de un artículo.

El lenguaje de consulta para el índice es anterior en este hilo y funciona bien hasta que un elemento se adquiere y se libera exactamente al mismo tiempo para un usuario. El Índice asigna a ambas acciones el mismo valor, lo que descarta los cálculos de forma bastante sustancial. Ejemplo en la imagen a continuación, donde las últimas 2 líneas de un artículo se adquieren y liberan al mismo tiempo y a ambos se les asigna el mismo valor de índice (17). Idealmente, quiero que el índice asigne el valor de 17 y 18, o simplemente ignore esto por completo, ya que el valor de tiempo correspondiente sería cero. Lo probé eliminando manualmente esas 2 últimas entradas de la fuente de datos y los cálculos son perfectos. Necesito que se eliminen los mismos valores o que se me asigne el valor de índice correcto. Gracias si puedes ayudar.

Consulta de índice:

Index = 
IF (
    OR ( 'OpenLicenseUsage-9601427'[Action] = "Released", 'OpenLicenseUsage-9601427'[Action] = "Acquired" ),
    RANKX (
        FILTER (
            ALL ( 'OpenLicenseUsage-9601427'),
            OR ( 'OpenLicenseUsage-9601427'[Action] = "Released", 'OpenLicenseUsage-9601427'[Action] = "Acquired" )
                && 'OpenLicenseUsage-9601427'[User] = EARLIER ( 'OpenLicenseUsage-9601427'[User] )
        ),
        'OpenLicenseUsage-9601427'[Timestamp (UTC)],
        ,
        asc
    )
)

Capturar.JPG

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *