Cómo contar valores duplicados en M

Un usuario Pregunto ✅

bullio

Hola

Tengo una tabla que se ve así:

IDENTIFICACIÓN ID de persona
1 A
2 A
3 B
4 C
5 D
6 mi
7 F
8 GRAMO
9 GRAMO
10 GRAMO

Quiero agregar una columna que cuente cuántos empleos tiene cada PersonID, por ejemplo:

ID de empleo ID de persona Número de empleos
1 A 2
2 A 2
3 B 1
4 C 1
5 D 1
6 mi 1
7 F 1
8 GRAMO 3
9 GRAMO 3
10 GRAMO 3

Quiero hacer esto en el Editor de consultas, así que usando M.

Gracias.

mfelix

Hola @bullius,

Debe hacer un grupo por ID de persona y luego hacer una fusión del paso antes del resultado de Agrupar por y Agrupar por, esta parte puede hacerlo fusionando la tabla consigo misma y luego cambiando la primera tabla al paso que usted desear.

Consulte el código M para una tabla de entrada en power query.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each Table.RowCount(_), type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"PersonID"},#"Grouped Rows",{"PersonID"},"Grouped Rows",JoinKind.LeftOuter),
    #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"Count"}, {"Grouped Rows.Count"})
in
    #"Expanded Grouped Rows"

Paso a paso:

grupo.png

Saludos,

mfelix

mfelix

En respuesta a bullio

Hola @bullius,

Usando la opción de @MarcelBeug,

He rehecho el código M:

    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each _, type table}, {"PersonID.1", each Table.RowCount(_), type number}}),
    #"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"ID"}, {"ID"})
in
    #"Expanded Count"

Así que este es para Marcel. 😄

Saludos

mfelix

Marcel Beug

En respuesta a mfelix

Gracias @MFélix.

Yo lo hubiera hecho un poco diferente:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"AllRows", each _, Value.Type(#"Changed Type")}, {"Count", each Table.RowCount(_), type number}}),
    #"Expanded AllRows" = Table.ExpandTableColumn(#"Grouped Rows", "AllRows", {"ID"}, {"ID"})
in
    #"Expanded AllRows"

Te perdiste la parte del video entre 0:30 – 0:50 donde reemplazo tabla de tipos.

Una desventaja (o error o error de diseño o problema) de la operación «Todas las filas» en Agrupar por:
todos los tipos de columna de las tablas anidadas se restablecen a «Cualquiera», que puede ver después de la expansión.

Es por eso que siempre reemplazo type table con Tipo de valor(nombre del paso) donde nombre del paso es el mismo nombre de paso que el primer parámetro de Table.Group.

Todo esto se explica en este fragmento de video, que en realidad es parte de una lista de reproducción de 3 videos sobre Value.Type.

mfelix

Hola @bullius,

Debe hacer un grupo por ID de persona y luego hacer una fusión del paso antes del resultado de Agrupar por y Agrupar por, esta parte puede hacerlo fusionando la tabla consigo misma y luego cambiando la primera tabla al paso que usted desear.

Consulte el código M para una tabla de entrada en power query.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each Table.RowCount(_), type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"PersonID"},#"Grouped Rows",{"PersonID"},"Grouped Rows",JoinKind.LeftOuter),
    #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"Count"}, {"Grouped Rows.Count"})
in
    #"Expanded Grouped Rows"

Paso a paso:

grupo.png

Saludos,

mfelix

Marcel Beug

En respuesta a mfelix

Usar Agrupar por con la operación (adicional) «Todas las filas» es equivalente a fusionar 2 tablas.

bullio

En respuesta a Marcel Beug

¡Gracias por todas tus respuestas!

@MarcelBeug, ¿podría dar un ejemplo del código que incluiría la operación «Todas las filas»?

mfelix

En respuesta a bullio

Hola @bullius,

Usando la opción de @MarcelBeug,

He rehecho el código M:

    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each _, type table}, {"PersonID.1", each Table.RowCount(_), type number}}),
    #"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"ID"}, {"ID"})
in
    #"Expanded Count"

Así que este es para Marcel. 😄

Saludos

mfelix

Marcel Beug

En respuesta a mfelix

Gracias @MFélix.

Yo lo hubiera hecho un poco diferente:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"AllRows", each _, Value.Type(#"Changed Type")}, {"Count", each Table.RowCount(_), type number}}),
    #"Expanded AllRows" = Table.ExpandTableColumn(#"Grouped Rows", "AllRows", {"ID"}, {"ID"})
in
    #"Expanded AllRows"

Te perdiste la parte del video entre 0:30 – 0:50 donde reemplazo tabla de tipos.

Una desventaja (o error o error de diseño o problema) de la operación «Todas las filas» en Agrupar por:
todos los tipos de columna de las tablas anidadas se restablecen a «Cualquiera», que puede ver después de la expansión.

Es por eso que siempre reemplazo type table con Tipo de valor(nombre del paso) donde nombre del paso es el mismo nombre de paso que el primer parámetro de Table.Group.

Todo esto se explica en este fragmento de video, que en realidad es parte de una lista de reproducción de 3 videos sobre Value.Type.

mfelix

En respuesta a Marcel Beug

Hola @MarcelBeug,

Tienes razón, hice el cambio pero copié el código M incorrecto: D.

mfelix

mfelix

En respuesta a Marcel Beug

Gracias @MarcelBeug,

Siempre aprendiendo :D:D

mfelix

jthomson

Es casi seguro que hay una manera más eficiente de hacer esto que la siguiente, pero puede:

– Duplica tu consulta

– Agrupe las filas en el duplicado por ID de persona, incluida una columna que cuente el número de filas

– Vuelva a unir esto a su consulta original

editar: acabo de recordar que hago algo bastante similar en uno de mis informes y que no es necesario duplicarlo en absoluto, puede hacer lo mismo que los pasos 2/3 anteriores, pero reformule el paso de agrupación para que cree una nueva tabla, entonces algo como

NewTable = Table.Group(#»Paso anterior», {«ID de empleado»}, {{«Recuento de empleos», cada Table.RowCount(_), escriba el número}}),

ImportNewTable = Table.Join(#»Paso anterior», «ID de empleado», NewTable, «ID de empleado»)

Marcel Beug

Puede utilizar Agrupar por.

Coincidentemente respondí una pregunta similar con un video.

En el video, se devuelve un mínimo en lugar de un conteo, de lo contrario, se ajusta a sus requisitos,

Deja un comentario

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