Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
amalm
Helper III
Helper III

Creación de una tabla combinada para Login-Logout

Hola

Mis datos están en 2 tablas, una para el inicio de sesión y la otra para cerrar la sesión. El formato es el siguiente:

amalm_0-1596044679912.png

Quiero que la tabla resultante esté en este formato:

amalm_1-1596044717391.png

Como puede ver, quiero que cada inicio de sesión tenga un cierre de sesión correspondiente en la misma fila. En caso de que un usuario se olvide de cerrar la sesión (o iniciar sesión para el caso), esa parte de la fila debe dejarse en blanco. Los usuarios pueden iniciar y cerrar sesión varias veces en el mismo día.

No sé por dónde empezar, cualquier ayuda será muy apreciada.

1 ACCEPTED SOLUTION

Aquí hay una manera de hacer esto. A continuación se muestran consultas de 3 M con datos similares como ejemplo. Para ver cómo funciona, simplemente cree una consulta en blanco, vaya a Advanced Editor y reemplace el texto allí con el código M siguiente (X3). Los dos primeros son solo algunas tablas de ejemplo como los datos.

// call this query "login"
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtQ31DcyMDJQ0lEytzIwACIFR18gJ7Q4tcgQSBsaGCjF6qCos0RXZwSkjeDqjPCaZ4ypDsM8kDoTkLpYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Username = _t, Param1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Event", each "Login")
in
    #"Added Custom"

//call this query "logout"
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtQ31DcyMDJQ0lEytzI0sDIwUHD0BXJCi1OLDIG0oYGBUqwOijqgKmNUhUZA2hSqEMiEIog2I5g2SysjTOPNQLpiAQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Username = _t, Param1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Date] <> null)),
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Event", each "Logout")
in
    #"Added Custom"

//call this query what you want
let
    Source = Table.Combine({login, logout}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Event", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Username", Order.Ascending}, {"Date", Order.Ascending}, {"Time", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type),
    #"Added Custom" = Table.AddColumn(#"Added Index", "ForPivot", each if [Event] = "Login" then [Index] else null),
    #"Filled Down" = Table.FillDown(#"Added Custom",{"ForPivot"}),
    #"Added Custom1" = Table.AddColumn(#"Filled Down", "Records", each #"Filled Down"{[Index]}),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1",{"Event", "ForPivot", "Records"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Other Columns", List.Distinct(#"Removed Other Columns"[Event]), "Event", "Records"),
    #"Expanded Login" = Table.ExpandRecordColumn(#"Pivoted Column", "Login", {"Date", "Time", "Username", "Param1"}, {"Date", "Time", "Username", "Param1"}),
    #"Expanded Logout" = Table.ExpandRecordColumn(#"Expanded Login", "Logout", {"Time", "Param1"}, {"Time.1", "Param1.1"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Logout",{"ForPivot"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}, {"Time.1", type time}, {"Param1.1", Int64.Type}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Time", "Time In"}, {"Time.1", "Time Out"}, {"Param1", "Param1 (in)"}, {"Param1.1", "Param1 (out)"}}),
    #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"Date", "Username", "Time In", "Time Out", "Param1 (in)", "Param1 (out)"})
in
    #"Reordered Columns"

Si esto funciona para usted, márquelo como la solución. Los elogios también son apreciados. Por favor, avísame si no.

saludos

palmadita





Did I answer your question? Mark my post as a solution! Kudos are also appreciated!

To learn more about Power BI, follow me on Twitter or subscribe on YouTube.


@mahoneypa HoosierBI on YouTube


View solution in original post

6 REPLIES 6
v-yingjl
Community Support
Community Support

Hola @amalm ,

Es difícil lograrlo directamente. Debido a que no hay ninguna lógica para determinar cuándo el usuario "olvidó cerrar sesión" después de iniciar sesión, por ejemplo, por qué cerrar sesión después de que user1 inicie sesión a las 7 de la mañana no puede estar a las 4 p. m., pero debe ser un valor nulo. Por supuesto que sabemos que es 'Olvidé cerrar sesión', pero el equipo no tiene manera de juzgar esta lógica para lograr la llamada correspondencia entre filas cuando las filas de las dos tablas no son iguales.
Un enfoque consiste en agregar manualmente la columna de índice entre las dos tablas, como se muestra en la figura siguiente, para forzar que el número de fila sea igual y usar merge para combinar las dos tablas. La desventaja es que esto será bastante complicado cuando hay una gran cantidad de datos.

log in.pnglogout.png

Combinar tablas basadas en la columna de índice:

merge.png

Expanda y elimine columnas innecesarias, ajuste la posición de la columna y cambie el nombre de las columnas para mostrar el resultado:

result.png

Best Looks,
Yingjie Li

Si este post ayuda, por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Gracias por las respuestas.

Las tablas que había proporcionado son simplificaciones excesivas de los datos reales que tengo.

@v-yingjl la solución que proporcionó no funcionará para nosotros, porque hay alguna otra complejidad involucrada.

Sin embargo, hay una manera que puedo pensar, para derivar la lógica para este requisito: Los valores para Param1 (para cada usuario) siempre serán ascendentes, no hay ninguna posibilidad de que se reduzca durante un período de tiempo.

Así que podemos saber si alguien se ha olvidado de iniciar sesión / cerrar sesión cuando hay 2 de cualquiera de ellos en una secuencia sin el otro correspondiente.

En este caso, ¿cómo puedo hacer la tabla resultante?

Golpe.

@v-yingjl @collinq

¿Alguna idea, por favor?

Aquí hay una manera de hacer esto. A continuación se muestran consultas de 3 M con datos similares como ejemplo. Para ver cómo funciona, simplemente cree una consulta en blanco, vaya a Advanced Editor y reemplace el texto allí con el código M siguiente (X3). Los dos primeros son solo algunas tablas de ejemplo como los datos.

// call this query "login"
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtQ31DcyMDJQ0lEytzIwACIFR18gJ7Q4tcgQSBsaGCjF6qCos0RXZwSkjeDqjPCaZ4ypDsM8kDoTkLpYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Username = _t, Param1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Event", each "Login")
in
    #"Added Custom"

//call this query "logout"
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtQ31DcyMDJQ0lEytzI0sDIwUHD0BXJCi1OLDIG0oYGBUqwOijqgKmNUhUZA2hSqEMiEIog2I5g2SysjTOPNQLpiAQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Username = _t, Param1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Date] <> null)),
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Event", each "Logout")
in
    #"Added Custom"

//call this query what you want
let
    Source = Table.Combine({login, logout}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Event", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Username", Order.Ascending}, {"Date", Order.Ascending}, {"Time", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type),
    #"Added Custom" = Table.AddColumn(#"Added Index", "ForPivot", each if [Event] = "Login" then [Index] else null),
    #"Filled Down" = Table.FillDown(#"Added Custom",{"ForPivot"}),
    #"Added Custom1" = Table.AddColumn(#"Filled Down", "Records", each #"Filled Down"{[Index]}),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1",{"Event", "ForPivot", "Records"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Other Columns", List.Distinct(#"Removed Other Columns"[Event]), "Event", "Records"),
    #"Expanded Login" = Table.ExpandRecordColumn(#"Pivoted Column", "Login", {"Date", "Time", "Username", "Param1"}, {"Date", "Time", "Username", "Param1"}),
    #"Expanded Logout" = Table.ExpandRecordColumn(#"Expanded Login", "Logout", {"Time", "Param1"}, {"Time.1", "Param1.1"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Logout",{"ForPivot"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"Date", type date}, {"Time", type time}, {"Username", type text}, {"Param1", Int64.Type}, {"Time.1", type time}, {"Param1.1", Int64.Type}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Time", "Time In"}, {"Time.1", "Time Out"}, {"Param1", "Param1 (in)"}, {"Param1.1", "Param1 (out)"}}),
    #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"Date", "Username", "Time In", "Time Out", "Param1 (in)", "Param1 (out)"})
in
    #"Reordered Columns"

Si esto funciona para usted, márquelo como la solución. Los elogios también son apreciados. Por favor, avísame si no.

saludos

palmadita





Did I answer your question? Mark my post as a solution! Kudos are also appreciated!

To learn more about Power BI, follow me on Twitter or subscribe on YouTube.


@mahoneypa HoosierBI on YouTube


Esto es excelente, ¡muchas gracias!

Te avisaré si tengo problemas con los datos reales.

collinq
Super User
Super User

Hola @amalm ,

Hay muchas maneras de hacer esto. Probablemente uno de los menos técnicos y más manuales sería traerlos como consultas separadas - nombre uno como Iniciar sesión y uno como Cerrar sesión. Quite la línea superior, cree los encabezados de la primera fila. A continuación, combine los dos en función de Usuario y Fecha. El título "Cerrar sesión" se mostrará automáticamente delante de los nombres de los campos. Se verá así:

2020-07-29_13-48-55.jpg

Agradecería Kudos si mi respuesta fue útil. También agradecería que marcara esto como una solución si resolviera el problema. ¡Gracias!




Did I answer your question? Mark my post as a solution!

Proud to be a Datanaut!
Private message me for consulting or training needs.




Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors