Skip to main content
Announcements
New: No-code data prep in Qlik Cloud Analytics™ TAKE A TOUR
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Como contar el número de días que un usuario ha estado activo?

Hola,

Espero alguien tenga una solución óptima para mi problema, les cuento.

Tengo un log con los usuarios de un sistema, aquí se registran activaciones e inactivaciones, donde un usuario puede ser reactivado, entonces lo que necesito es una forma de contar los días que ha estado activo el usuario entre activaciones e inactivaciones y ademas que este conteo se pueda hacer dependiento el mes de consulta (filtro).

Este sería un ejemplo del resultado que necesito, las primeras 4 columnas ya las tengo, el problema es como contar los días que ha estado activo, ya que se pueden atravesar inactivaciones y es necesario mantener el valor para cuando se vuelva a reactivar, por ejemplo la última fila se calcula Fecha-Mes de consulta(=26)+Dias activos acumulados (66)

País

ID Usuario

Fecha (DD/MM/YYYY)

Actividad

Mes de consulta

Días usuario activo al mes de consulta

X

1234

01/08/2015

Activación

31/08/2015

30

X

1234

01/08/2015

Activación

30/09/2015

60

X

1234

06/10/2015

Inactivación

31/10/2015

66

X

1234

06/10/2015

Inactivación

30/11/2015

66

X

1234

06/10/2015

Inactivación

31/12/2015

66

X

1234

05/01/2016

Activación

31/01/2016

92

Y

5647

...

...

...

...

El problema lo intente resolver con variables y con un loop, pero al calcularse línea a línea tarda mucho tiempo en procesarlo, tengo alrededor de 5 millones de registros. Cabe mencionar que los datos lo tengo que graficar por País sacando un promedio de días activos

De antemano gracias

  Saludos!

1 Solution

Accepted Solutions
hector_munoz
Specialist
Specialist

Hola Jesús,

No sé si te manejarás bien en script, pero esto es lo que yo haría:

PRECONDICIONES

  • Existe una tabla de hechos en la que aparece la información del usuario (p.e. "1234"), el tipo de actividad ("Activación" o "Inactivación") y la fecha del evento (p.e. "01/08/2015"para el primer registro de activación del usuario "1234").
  • En esta tabla se crea un registro cuando se cambia de tipo de actividad; es decir un usuario tiene un registro de activación y hasta que no se desactiva no se crea uno nuevo para el usuario y viceversa.

DESARROLLO DE SCRIPT

  • En una tabla auxiliar AUX_1 copiaría todos los registros de la tabla que contiene la información de activaciones y solo los campos de usuario, fecha y tipo de actividad; ordenados por usuario ASC, fecha DESC.
  • En otra tabla auxiliar AUX_2 copiaría todos los registros de la tabla auxiliar AUX_1 y crearía un campo que fuese FECHA_FIN. Esta fecha sería el día de la recarga (función Today()) para el primer registro de un usuario (recuerda que el primer registro de un usuario es el de la fecha máxima porque has ordenado por fecha DESC en la tabla AUX_1) y la fecha de actividad del registro anterior menos 1 en otro caso.
    • El primer registro de un usuario cumple que Usuario <> Previous(Usuario), ya que hemos ordenado en la tabla AUX_1 por usuario en primer lugar.
    • El resto de registros de un usuario cumplen que Usuario = Previous(Usuario).
    • La función Previous() nos permite acceder al registro cargado inmediatamente antes que el que está siendo cargado en este momento cuando hacemos un LOAD. Por eso es importante el paso primero en el que ordenamos. Con la función Previous(), y comparando el usuario del registro actual con el del registro anterior, sabemos si es el primer registro de un usuario (el de la fecha máxima) o no y también podemos obtener la fecha de inicio del registro anterior y usarla como fecha fin del actual.
  • Luego, haría un JOIN para pasarle a la tabla de hechos la información de la fecha de fin de la tabla auxiliar AUX_2.

DESARROLLO EN DISEÑO

  • Cuando el usuario seleccione un mes, se actualizaría una variable que contiene la fecha máxima de ese mes
  • En mi expresión que calcula los días de actividad sumaría los días entre FECHA_FIN - FECHA (o la parte proporcional) de aquellos registros de activación cuya FECHA_FIN <= Variable_Fecha o FECHA <= Variable_Fecha.

Espero que te sirva...

Saludos,

H

View solution in original post

6 Replies
hector_munoz
Specialist
Specialist

Hola Jesús,

No sé si te manejarás bien en script, pero esto es lo que yo haría:

PRECONDICIONES

  • Existe una tabla de hechos en la que aparece la información del usuario (p.e. "1234"), el tipo de actividad ("Activación" o "Inactivación") y la fecha del evento (p.e. "01/08/2015"para el primer registro de activación del usuario "1234").
  • En esta tabla se crea un registro cuando se cambia de tipo de actividad; es decir un usuario tiene un registro de activación y hasta que no se desactiva no se crea uno nuevo para el usuario y viceversa.

DESARROLLO DE SCRIPT

  • En una tabla auxiliar AUX_1 copiaría todos los registros de la tabla que contiene la información de activaciones y solo los campos de usuario, fecha y tipo de actividad; ordenados por usuario ASC, fecha DESC.
  • En otra tabla auxiliar AUX_2 copiaría todos los registros de la tabla auxiliar AUX_1 y crearía un campo que fuese FECHA_FIN. Esta fecha sería el día de la recarga (función Today()) para el primer registro de un usuario (recuerda que el primer registro de un usuario es el de la fecha máxima porque has ordenado por fecha DESC en la tabla AUX_1) y la fecha de actividad del registro anterior menos 1 en otro caso.
    • El primer registro de un usuario cumple que Usuario <> Previous(Usuario), ya que hemos ordenado en la tabla AUX_1 por usuario en primer lugar.
    • El resto de registros de un usuario cumplen que Usuario = Previous(Usuario).
    • La función Previous() nos permite acceder al registro cargado inmediatamente antes que el que está siendo cargado en este momento cuando hacemos un LOAD. Por eso es importante el paso primero en el que ordenamos. Con la función Previous(), y comparando el usuario del registro actual con el del registro anterior, sabemos si es el primer registro de un usuario (el de la fecha máxima) o no y también podemos obtener la fecha de inicio del registro anterior y usarla como fecha fin del actual.
  • Luego, haría un JOIN para pasarle a la tabla de hechos la información de la fecha de fin de la tabla auxiliar AUX_2.

DESARROLLO EN DISEÑO

  • Cuando el usuario seleccione un mes, se actualizaría una variable que contiene la fecha máxima de ese mes
  • En mi expresión que calcula los días de actividad sumaría los días entre FECHA_FIN - FECHA (o la parte proporcional) de aquellos registros de activación cuya FECHA_FIN <= Variable_Fecha o FECHA <= Variable_Fecha.

Espero que te sirva...

Saludos,

H

Anonymous
Not applicable
Author

Hola Hector,

Gracias por tu comentario, pero lo que me esta haciendo falta es como hacer el cálculo de la última columna, de hecho como fuente de datos solo tengo, para el caso de mi ejemplo 3 registros, uno para la primera activación otro para la inactivación y uno mas para la "reactivación", lo que hago por medio de script, es calcular su estatus en determinado punto en el tiempo (al final de cada mes) por eso mi número de registros crece en uno por cada mes, gracias a esto dentro de mi dashboard puedo filtrar por año y mes y saber el estatus del usuario en esa selección. Pero como te comento, no logro saber cuanto tiempo ha estado activo el usuario

Saludos

hector_munoz
Specialist
Specialist

Perdona Jesús, que se había cortado antes de tiempo y se había guardado... Ya he terminado de redactarlo!

Anonymous
Not applicable
Author

Suena interesante tu propuesta, voy a hacer las pruebas y te cuento si funcionó.

Gracias!!!

Anonymous
Not applicable
Author

Hola Hector,

Muchas gracias por tu aporte, solo tuve que meterlo en un loop para tener el resultado exacto que necesitaba, me has salvado

Gracias!

hector_munoz
Specialist
Specialist

Me alegro Jesús! La verdad es que el tema de las fechas de inicio y fin de estados es un tema un poco "pesado" de lograr con QlikView, pero con este mecanismo luego funciona muy bien... Saludos!