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 ) )
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 ) )