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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Zyg_D
Continued Contributor
Continued Contributor

Power Query M - manteniendo solo las filas superiores basadas en pocas columnas

Estos son mis datos:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETaGCpuZgYUdczKTU6HCliBsqRQbCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}})
in
    #"Changed Type"

data.JPG

Con Power Query quiero mantener solo las filas que tienen la puntuación máxima para cada nombre y tipo. En este ejemplo, la columna Clase representa muchas otras columnas que tengo, pero no quiero afectarlas ni siquiera hacer referencia a ellas: quiero mantenerlas tal cual. Así es como debe verse la tabla resultante:
desired_result.JPG

1 ACCEPTED SOLUTION
Zyg_D
Continued Contributor
Continued Contributor

Gracias - @MFelix, @FrankAT

Hice una solución yo mismo, fusionando sus ideas - Agregué una columna de índice después de realizar una ordenación (idea de MFelix). Más tarde hice una unión (idea FrankAT) basada en la nueva columna de índice.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETYGqQRiMzOwsGNOZnIqkrClpVJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Name", Order.Ascending}, {"Score", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 1, 1, Int64.Type),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Name", "Type"}, {{"IndexOfMaxScore", each List.Max([Index]), type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Added Index", {"Index"}, #"Grouped Rows", {"IndexOfMaxScore"}, "MergeResults", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Index", "MergeResults"})
in
    #"Removed Columns"

@v-lili6-msft - ¡gracias! Tienes razón, ¡no sabía que podía hacerlo! Cambié

#"Merged Queries" = Table.NestedJoin(#"Whole Table", {"Score"}, #"Grouped Rows", {"Max"}, "Whole Table", JoinKind.Inner),

Con

#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Score", "Name", "Type"}, #"Grouped Rows", {"Max", "Name", "Type"}, "Whole Table", JoinKind.Inner),


Por lo tanto, la versión de trabajo completa entonces sería esto:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETYGqQRiMzOwsGNOZnIqkrClpVJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name", "Type"}, {{"Max", each List.Max([Score]), type nullable number}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Score", "Name", "Type"}, #"Grouped Rows", {"Max", "Name", "Type"}, "Whole Table", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Whole Table"})
in
    #"Removed Columns"

¡Gracias a todos!!!

View solution in original post

9 REPLIES 9
Zyg_D
Continued Contributor
Continued Contributor

Gracias - @MFelix, @FrankAT

Hice una solución yo mismo, fusionando sus ideas - Agregué una columna de índice después de realizar una ordenación (idea de MFelix). Más tarde hice una unión (idea FrankAT) basada en la nueva columna de índice.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETYGqQRiMzOwsGNOZnIqkrClpVJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Name", Order.Ascending}, {"Score", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 1, 1, Int64.Type),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Name", "Type"}, {{"IndexOfMaxScore", each List.Max([Index]), type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Added Index", {"Index"}, #"Grouped Rows", {"IndexOfMaxScore"}, "MergeResults", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Index", "MergeResults"})
in
    #"Removed Columns"

@v-lili6-msft - ¡gracias! Tienes razón, ¡no sabía que podía hacerlo! Cambié

#"Merged Queries" = Table.NestedJoin(#"Whole Table", {"Score"}, #"Grouped Rows", {"Max"}, "Whole Table", JoinKind.Inner),

Con

#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Score", "Name", "Type"}, #"Grouped Rows", {"Max", "Name", "Type"}, "Whole Table", JoinKind.Inner),


Por lo tanto, la versión de trabajo completa entonces sería esto:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETYGqQRiMzOwsGNOZnIqkrClpVJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name", "Type"}, {{"Max", each List.Max([Score]), type nullable number}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Score", "Name", "Type"}, #"Grouped Rows", {"Max", "Name", "Type"}, "Whole Table", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Whole Table"})
in
    #"Removed Columns"

¡Gracias a todos!!!

FrankAT
Community Champion
Community Champion

Hola @Zyg_D

con sus datos de muestra obtengo la siguiente solución:

// Query
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETaGCpuZgYUdczKTU6HCliBsqRQbCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name"}, {{"Max", each List.Max([Score]), type nullable number}}),
    #"Whole Table" = #"Changed Type",
    #"Merged Queries" = Table.NestedJoin(#"Whole Table", {"Score"}, #"Grouped Rows", {"Max"}, "Whole Table", JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Whole Table"})
in
    #"Removed Columns"

11-09-_2020_11-28-59.png

Con saludos amables desde la ciudad donde la leyenda del 'Pied Piper de Hamelin' está en casa
FrankAT (Orgulloso de ser un Datanaut)

Zyg_D
Continued Contributor
Continued Contributor

@FrankAT - Gracias por la respuesta. Me gusta que no haga referencia a la columna Clase. Sin embargo, tiene 2 problemas. Pude arreglar uno, pero no el segundo.

1. Ya que quería "para mantener sólo las filas que tienen la puntuación máxima para cada nombre y tipo", cambié

#"Grouped Rows" = Table.Group(#"Changed Type", {"Name"}, {{"Max", each List.Max([Score]), type nullable number}}),


Con

#"Grouped Rows" = Table.Group(#"Changed Type", {"Name", "Type"}, {{"Max", each List.Max([Score]), type nullable number}}),

2. Creo que el principal problema es que al combinar el código sólo tiene en cuenta el valor máximo. Si en dos combinaciones separadas de Nombre y Tipo hubiera valores máximos idénticos, el código fallaría.

hola @Zyg_D

Creo que la solución de FrankAT debería funcionar para ti.

1.Desde que quería "mantener sólo las filas que tienen la puntuación máxima para cada nombre y tipo", he cambiado

En tu primera publicación, solo quieres obtener la puntuación máxima para cada nombre que no se agrupe por tipo

5.JPG

2. Si en dos combinaciones separadas de Nombre y Tipo hubiera valores máximos idénticos, el código fallaría.

Cuando se combina, simplemente agregue más condicional de clave en el código manualmente, a continuación, funcionará.

Si todavía tiene el problema, comparta más datos de muestra y su salida esperada.

saludos

Lin

Community Support Team _ Lin
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
MFelix
Super User
Super User

Hola @Zyg_D ,

Debe realizar un grupo por pero, a continuación, cambiar el código del grupo a una columna de índice y, a continuación, filtrar los valores para el número 1.

Por lo tanto, cuando se hace un grupo por se obtiene el siguiente código:

= Table.Group(#"Changed Type", {"Name"}, {{"Count", each _, type table [Name=nullable text, Class=nullable number, Type=nullable number, Score=nullable number]}})

En este código, el elemento después de la each_ debe reemplazarse con el código siguiente:

Table.AddIndexColumn(Table.Sort(_,{{"Score", Order.Descending}} ), "Index",1,1)

Este código está ordenando la información en función de la puntuación y agregando e indexando para que el código final sea:

= Table.Group(#"Changed Type", {"Name"}, {{"MAX_Score", each Table.AddIndexColumn(Table.Sort(_,{{"Score", Order.Descending}} ), "Index",1,1)}})

Ahora simplemente expanda la columna y filtre por el índice 1.

Compruebe el código completo a continuación:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCsnPVdJRMgRicyC2tFCK1YEJGsEEzcGCbkWJedlQYQsgNjVAETaGCpuZgYUdczKTU6HCliBsqRQbCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Name = _t, Class = _t, Type = _t, Score = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Class", Int64.Type}, {"Type", Int64.Type}, {"Score", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name"}, {{"MAX_Score", each Table.AddIndexColumn(Table.Sort(_,{{"Score", Order.Descending}} ), "Index",1,1)}}),
    #"Expanded MAX_Score" = Table.ExpandTableColumn(#"Grouped Rows", "MAX_Score", {"Class", "Type", "Score", "Index"}, {"Class", "Type", "Score", "Index"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded MAX_Score", each ([Index] = 1)),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Index"})
in
    #"Removed Columns"


Regards

Miguel Félix


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

Proud to be a Super User!

Check out my blog: Power BI em Português



Zyg_D
Continued Contributor
Continued Contributor

@MFelix - su respuesta tiene 1 problema que me fijo y otro que no puedo solucionar.

1. Puesto que quería "para mantener sólo las filas que tienen la puntuación máxima para cada nombre y tipo", he cambiado

    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name"}, {{"MAX_Score", each Table.AddIndexColumn(Table.Sort(_,{{"Score", Order.Descending}} ), "Index",1,1)}}),
    #"Expanded MAX_Score" = Table.ExpandTableColumn(#"Grouped Rows", "MAX_Score", {"Class", "Type", "Score", "Index"}, {"Class", "Type", "Score", "Index"}),

Con

    #"Grouped Rows" = Table.Group(#"Changed Type", {"Name", "Type"}, {{"MAX_Score", each Table.AddIndexColumn(Table.Sort(_,{{"Score", Order.Descending}} ), "Index",1,1)}}),
    #"Expanded MAX_Score" = Table.ExpandTableColumn(#"Grouped Rows", "MAX_Score", {"Class", "Score", "Index"}, {"Class", "Score", "Index"}),

2. No quería hacer referencia a la columna Clase, porque si lo hago, tendré que volver siempre a este código en caso de que mis datos obtengan más campos. Veo referencias a esta columna que es un problema.

Hola @Zyg_D ,

No es realmente substangin lo que quieres decir en el punto 2. "No quería hacer referencia a la columna Clase, porque si lo hago, tendré que volver siempre a este código en caso de que mis datos obtengan más campos. Veo referencias a esta columna que es un problema. "

La referencia a la clase que tiene es solo la presentación de la columna cuando se expande la tabla se puede sacar del paso de tabla de expansión.

O tiene alguna pregunta adicional sobre esto, el conjunto de datos que proporciona es muy pequeño por lo que es difícil obtener todas las expectativas en términos de resultados para presentar o no.


Regards

Miguel Félix


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

Proud to be a Super User!

Check out my blog: Power BI em Português



Zyg_D
Continued Contributor
Continued Contributor


@MFelix escribió:

No es realmente substangin lo que quieres decir en el punto 2. "No quería hacer referencia a la columna Clase, porque si lo hago, tendré que volver siempre a este código en caso de que mis datos obtengan más campos. Veo referencias a esta columna que es un problema. "


Mis datos originales se forman en el flujo de datos de Power BI. En Power Query, no hay referencias a ningún nombre de columna en el paso Origen. No hay ningún paso Cambiar tipo. Así que obtengo todas las columnas que son proporcionadas por el flujo de datos. Si se agregan más columnas al flujo de datos, las obtengo automáticamente. En los pasos siguientes, si menciono en cualquier lugar los nombres de columna exactos (referencias), estaré limitado en las acciones que afectan solo a esas columnas específicas. Las columnas adicionales que se agregaron al flujo de datos después de usar el código no aparecerán en mi tabla final a menos que corrija el código. No quiero volver al código todo el tiempo cuando se agregan más columsn al flujo de datos, por lo que necesito una solución sin nombres de columna explícitos en el código.


@MFelix escribió:

La referencia a la clase que tiene es solo la presentación de la columna cuando se expande la tabla se puede sacar del paso de tabla de expansión.


Quiero ser capaz de "expandir" o hacer cualquier cosa que se requiere para obtener la tabla deseada final, pero sin decir los nombres de columna exactos en el código. Si elimino ese nombre de columna ("Clase"), simplemente no obtengo esa columna, que no es lo que quiero - Necesito esa columna.

Tal vez hay otras soluciones que no utilizan la expansión, porque no creo que pueda utilizar esta funcionalidad, ya que simplemente requiere nombres de columna para ser codificados de forma rígida...

Hola @Zyg_D ,

Creo que @ImkeF puede ayudarte, ella es la referencia sobre el lenguaje M en la comunidad.

@ImkeF ¿Puedes echarle un vistazo a esto?


Regards

Miguel Félix


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

Proud to be a Super User!

Check out my blog: Power BI em Português



Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

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