Cuente la sesión por usuario por día con intervalo de 2 minutos

Un usuario Pregunto ✅

Anónimo

Hola a todos

Me pidieron que obtuviera una cantidad de usuarios que permanecen activos en una aplicación por día y duración en cada sesión.

El sistema está diseñado de manera que una vez que el usuario inicia sesión, una sesión se actualiza automáticamente cada 2 minutos hasta que la sesión caduca. Hay cierre de sesión, pero rara vez sucede. En ese caso, existe la necesidad de obtener datos con una precisión de 2 minutos a partir de la hora de inicio de sesión del usuario.

Aquí está la tabla actual disponible

Fecha y hora de inicio de sesión Usuario
7/Mayo/2020 10:15 1
7/Mayo/2020 10:17 1
7/Mayo/2020 10:18 2
7/Mayo/2020 10:19 1
7/Mayo/2020 10.20h 2
7/Mayo/2020 17:12 1
7/mayo/2020 17:14 1
7/Mayo/2020 19.20h 1
7/Mayo/2020 19:22 1
7/mayo/2020 19:23 3
7/Mayo/2020 19:24 1

Y el resultado deseado es tener 2 columnas/medidas adicionales denominadas «Intervalo» y «Sesión por día«.

Fecha Usuario Intervalo Sesión por día
7-may-20 1 4-6 minutos 2
7-may-20 1 2-4 minutos 1
7-may-20 2 4-6 minutos 1
7-may-20 3 0-2 minutos 1

Agradezco cualquier ayuda. Muchas gracias

allisonkennedy

En respuesta a Anónimo

@Anónimo ¿Está cerca, pero esperaría que su DAX devuelva casi todos los INICIO DE SESIÓN?

Anteriormente, como se usó en esta expresión, nos permite comparar el tiempo de ejecución con la verificación de inicio de sesión para cada fila de la tabla dentro de la expresión FILTER. Debe averiguar si ese tiempo de ejecución está dentro de los 2 minutos de cualquier otro tiempo de ejecución para el mismo usuario, por lo que contaremos todas las filas en las que esa condición es verdadera. La siguiente fórmula funciona con mis datos de muestra, pero querrá examinarla y sus datos de cerca y asegurarse de que entiende lo que está haciendo, ya que si sus intervalos se acercan demasiado, podría comenzar a tener algunas inconsistencias nuevamente.

Estado de inicio de sesión =
SI (
CUENTAS (
FILTRO (
LogTbl,
ANTES ( LogTbl[User] ) = LogTbl[User]
&& DATEDIFF ( ANTERIOR ( LogTbl[Login DateTime] ), LogTbl[LogInRecheck], MINUTO ) >= 0
&& DATEDIFF ( ANTERIOR ( LogTbl[Login DateTime] ), LogTbl[LogInRecheck], MINUTO ) <= 2
)
) = 1,
«Acceso»
)

allisonkennedy

Estoy a mitad de camino, pero aún no tengo la parte de la duración, necesito pensar en la sugerencia de @Greg_Deckler de usar MAXX para obtener la duración…

Esto es lo que tengo hasta ahora:

Cree una serie de COLUMNAS calculadas en la tabla:

LogInRecheck = LogTbl[Login DateTime]+TIEMPO(0,2,0)
LoginStatus = IF(COUNTROWS(FILTER(LogTbl,ANTERIOR(LogTbl[User])=Tabla de registro[User] && ANTES(LogTbl[Login DateTime])=Tabla de registro[LogInRecheck]))=1, «»,»Iniciar sesión»)
Esto ya le da el número total de sesiones por usuario: use el recuento de la columna LoginStatus como un valor en el informe.
Así que solo nos falta la duración/intervalo.
Como nota al margen, tPara obtener el número de cada inicio de sesión, también puede crear una columna (no es la solución más eficiente y en este momento no tendrá en cuenta las diferentes fechas, pero por alguna razón decidí clasificar a los usuarios primero, así que ya tenía esa información a mano) :
UserRank = RANKX(FILTER(LogTbl,LogTbl[User]= ANTERIOR (TblRegistro[User])), LogTbl[Login DateTime],,ASC)
LoginNumber = RANKX(LogTbl,IF(COUNTROWS(FILTER(LogTbl,ANTERIOR(LogTbl[User])=Tabla de registro[User] && ANTES(LogTbl[Login DateTime])=Tabla de registro[LogInRecheck]))=1,0,LogTbl[UserRank]),,ASC,Denso)-1

sanimesa

En respuesta a allisonkennedy

@AllisonKennedy¿Quizás también podamos detectar el paso de cierre de sesión? ¿Esto funciona? Acabo de invertir la condición de verificación de inicio de sesión en la segunda comparación:

LogoffStatus2 = IF(COUNTROWS(FILTER(UserLoginTable, EARLIER(UserLoginTable[User])=UserLoginTable[User] && EARLIER(UserLoginTable[LogInRecheck])=UserLoginTable[Login DateTime]))=1, "","Logoff")

allisonkennedy

En respuesta a sanimesa

@sanimesa parece que lo estás haciendo funcionar.

Aquí hay una idea para el intervalo:

SessionID = COUNTROWS(FILTER(LogTbl,LogTbl[User]= ANTERIOR (TblRegistro[User]) && LogTbl[LoginStatus]=»Iniciar sesión» && LogTbl[UserRank]<=ANTERIOR(TblRegistro[UserRank])))
Intervalo = SWITCH(COUNTROWS(FILTER(LogTbl,LogTbl[SessionID]= ANTERIOR (TblRegistro[SessionID]) && LogTbl[User]= ANTERIOR (TblRegistro[User]))), 1, «0-2 minutos», 2, «2-4 minutos», 3, «4-6 minutos», 4, «6-8 minutos», 5, «8-10 minutos», » >10 minutos»)
ambos como columnas calculadas de nuevo
Estoy seguro de que @Greg_Deckler puede proporcionar una solución más elegante, pero eso es lo que se le ocurrió a mi cerebro en las últimas horas de la noche de Nueva Zelanda.

¿Este post ha solucionado tu problema? Por favor márcalo como una solución para que otros puedan encontrarlo rápidamente y para que la comunidad sepa que su problema ha sido resuelto.


Si encuentra útil esta publicación, por favor dar felicitaciones.

Trabajo como formador y consultor de Microsoft 365, especializado en Power BI y Power Query.

https://sites.google.com/site/allisonkennedycv

Anónimo

En respuesta a allisonkennedy

@AllisonKennedy ¡Su solución es brillante! Gracias.

Casi allí… funciona si la duración es de 2 minutos exactos, sin embargo, el intervalo debe ser de 2 minutos. Así es como se ve en mis datos actuales. Los resaltados en amarillo están marcados como «Iniciar sesión» aunque debe estar en blanco.

1.png

Traté de modificar su código a esto, pero aún no me da el resultado correcto. ¿Alguna idea de qué debería ser?

Estado de inicio de sesión =
SI(
CUENTAS(
FILTRAR(
consulta1,
ANTERIOR(Consulta1[IDCHANNELUSER]) = Consulta1[IDCHANNELUSER] &&
ANTERIOR(Consulta1[EXECUTION_TIME]) >= Consulta1[LogInRecheck] &&
ANTERIOR(Consulta1[EXECUTION_TIME]) < Consulta1[LogInRecheck]
)
) = 1, «»,»Iniciar sesión»)

allisonkennedy

En respuesta a Anónimo

@Anónimo ¿Está cerca, pero esperaría que su DAX devuelva casi todos los INICIO DE SESIÓN?

Anteriormente, como se usó en esta expresión, nos permite comparar el tiempo de ejecución con la verificación de inicio de sesión para cada fila de la tabla dentro de la expresión FILTER. Debe averiguar si ese tiempo de ejecución está dentro de los 2 minutos de cualquier otro tiempo de ejecución para el mismo usuario, por lo que contaremos todas las filas en las que esa condición es verdadera. La siguiente fórmula funciona con mis datos de muestra, pero querrá examinarla y sus datos de cerca y asegurarse de que entiende lo que está haciendo, ya que si sus intervalos se acercan demasiado, podría comenzar a tener algunas inconsistencias nuevamente.

Estado de inicio de sesión =
SI (
CUENTAS (
FILTRO (
LogTbl,
ANTES ( LogTbl[User] ) = LogTbl[User]
&& DATEDIFF ( ANTERIOR ( LogTbl[Login DateTime] ), LogTbl[LogInRecheck], MINUTO ) >= 0
&& DATEDIFF ( ANTERIOR ( LogTbl[Login DateTime] ), LogTbl[LogInRecheck], MINUTO ) <= 2
)
) = 1,
«Acceso»
)

allisonkennedy

En respuesta a sanimesa

Sí, eso funcionará para cerrar sesión.

greg_deckler

En respuesta a allisonkennedy

@AllisonKennedy debería poder obtener la duración/intervalo usando esta técnica: vea mi artículo sobre el tiempo medio entre fallas (MTBF) que usa ANTERIOR: http://community.powerbi.com/t5/Community-Blog/Mean-Time -Entre-Fallo-MTBF-y-Power-BI/ba-p/3395…

Lo siento, debería haber publicado eso… antes (mala broma).

greg_deckler

Bueno, no he mirado esto lo suficientemente cerca como para darte una respuesta definitiva, pero va a involucrar ANTES. Consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

Creo que comenzaría por obtener los minutos entre una fila y la fila anterior (usando MAXX y EARLIER). Luego, puede pasar de allí a filas agregadas, ya que si esa duración es superior a 2 minutos, es una nueva sesión.

Eso es lo que estoy pensando.

Deja un comentario

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