cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Highlighted
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

Accepted Solutions
Highlighted

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? Please mark my post as a solution! Kudos are also appreciated!

Proud to be a Super User!




View solution in original post

6 REPLIES 6
Highlighted
Memorable Member
Memorable Member

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!

Highlighted
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.

Highlighted

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?

Highlighted

Golpe.

@v-yingjl @collinq

¿Alguna idea, por favor?

Highlighted

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? Please mark my post as a solution! Kudos are also appreciated!

Proud to be a Super User!




View solution in original post

Highlighted

Esto es excelente, ¡muchas gracias!

Te avisaré si tengo problemas con los datos reales.

Helpful resources

Announcements
Community Conference

Power Platform Community Conference

Check out the on demand sessions that are available now!

Community Conference

Microsoft Power Platform Communities

Check out the Winners!

secondImage

Create an end-to-end data and analytics solution

Learn how Power BI works with the latest Azure data and analytics innovations at the digital event with Microsoft CEO Satya Nadella.

Top Solution Authors
Top Kudoed Authors