Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.
Estoy buscando eliminar duplicados en una tabla, pero quiero asegurarme de que las filas que estoy manteniendo son las que realmente quiero.
Por ejemplo, tengo algo como lo siguiente donde tengo un ID de recuento y dos empleados asignados a la cuenta
Id | Empleado 1 | Empleado 2 |
123 | Joe | Eddie |
456 | Frank | Felicia |
789 | Monica | Betty |
789 | Monica | Betty |
789 | Hannah | Brett |
123 | Joe | Hank |
Tengo la impresión de que si elimino duplicados en Power Query, siempre conservará la última instancia. También estoy bajo la suposición de que cada vez que anexe nuevos datos a Power BI, los datos más recientes se agregan a la parte inferior de cada tabla. En el ejemplo anterior, me gustaría mantener la última instancia de cada una de las columnas de identificador, ya que contienen las asignaciones de empleados más actualizadas. Esencialmente, quiero estar seguro de que una vez que descarte los duplicados de ID, siempre devuelvo lo siguiente
Id | Empleado 1 | Empleado 2 |
456 | Frank | Felicia |
789 | Hannah | Brett |
123 | Joe | Hank |
Quiero estar seguro de que todo está actuando como espero y estoy presentando los datos más relevantes y actualizados.
¿Alguien puede confirmar que la función drop duplicates siempre actuará de esta manera?
Solved! Go to Solution.
Hola @markmess77,
Puede consultar el siguiente código de ejemplo para cumplir sus requisitos:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQyVtJR8spPBZKuKSmZqUqxOtFKJqZmQL5bUWJeNohOzclMzkwEy5hbWAJFfPPzMpMTgQyn1JKSSmIkPBLz8hIzQBJFQBmwBLLVHiCbYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, #"Employee 1" = _t, #"Employee 2" = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Employee 1", type text}, {"Employee 2", type text}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"ID"}, {{"Count", each Table.LastN(_,1), type table [ID= number, Employee 1=text, Employee 2=text]}}),
#"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"Employee 1", "Employee 2"}, {"Employee 1", "Employee 2"})
in
#"Expanded Count"
Lógica:
1. Agrupe las filas de la tabla en función de los campos de ID.
2. Mantenga la última fila de cada tabla agrupada.
3. Expanda los registros de tabla de grupo filtrados.
saludos
Xiaoxin Sheng
Hola
Este código M funciona
let
Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Employee 1", type text}, {"Employee 2", type text}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"ID"}, {{"Max of index", each List.Max([Index]), type number}}),
Joined = Table.Join(#"Added Index", "ID", #"Grouped Rows", "ID"),
#"Added Custom" = Table.AddColumn(Joined, "Test", each if [Index]=[Max of index] then "Keep" else "Discard"),
#"Filtered Rows" = Table.SelectRows(#"Added Custom", each ([Test] = "Keep")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Index", "Max of index", "Test"})
in
#"Removed Columns"
Espero que esto ayude.
Hola @markmess77,
Puede consultar el siguiente código de ejemplo para cumplir sus requisitos:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQyVtJR8spPBZKuKSmZqUqxOtFKJqZmQL5bUWJeNohOzclMzkwEy5hbWAJFfPPzMpMTgQyn1JKSSmIkPBLz8hIzQBJFQBmwBLLVHiCbYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, #"Employee 1" = _t, #"Employee 2" = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Employee 1", type text}, {"Employee 2", type text}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"ID"}, {{"Count", each Table.LastN(_,1), type table [ID= number, Employee 1=text, Employee 2=text]}}),
#"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"Employee 1", "Employee 2"}, {"Employee 1", "Employee 2"})
in
#"Expanded Count"
Lógica:
1. Agrupe las filas de la tabla en función de los campos de ID.
2. Mantenga la última fila de cada tabla agrupada.
3. Expanda los registros de tabla de grupo filtrados.
saludos
Xiaoxin Sheng
¡Gracias por la propina!
Una pregunta potencialmente tonta. ¿Utilizo el código que proporcionó en una expresión DAX al crear una nueva tabla? ¿O es algo diferente?
Hola @markmess77 ,
Pruebe este código:
Dejar
Fuente: Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQyVtJR8spPBZKuKSmZqUqxOtFKJqZmQL5bUWJeNohOzclMzkwEy5hbWAJFfPPzMTTgQyn1JKSSmIk4PBLz8hHH4BJF BinaryEncoding.Base64), Compression.Deflate)), let _t á ((texto de tipo) meta [Serialized.Text ? true]) en la tabla de tipos [ID á _t, "Empleado 1" á _t, "Empleado 2" - _t]),
"Tipo modificado" ? Tabla.TransformColumnTypes(Fuente, "ID", Int64.Type, "Empleado 1", texto de tipo, "Empleado 2", texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo, texto de tipo
Grupo: Table.Group('Changed Type'', ''ID'', ''Rows'',''Rows'', cada Tabla.AddIndexColumn(_, "Index", 1), escriba table'),
"Filas expandidas" ? Tabla.ExpandTableColumn(Grupo, "Filas", "Empleado 1", "Empleado 2", "Índice", "Empleado 1", "Empleado 2", "Índice", "Índice", "Índice", "Índice",),
"Añadido personalizado" - Tabla.AddColumn ("Filas expandidas", "Personalizado", cada tabla.grupo("Filas expandidas", "ID", "Max", cada List.Max([Índice]),
"Personalizado Expandido" - Tabla.ExpandTableColumn("Añadido Personalizado", "Personalizado", "ID", "Max", "ID.1", "Max"-),
"Añadido Personalizado1" - Tabla.AddColumn("Personalizado Expandido", "Personalizado", cada uno si [ID] - [ID.1] y [Index] á [Max] entonces 1 si 0),
"Filas filtradas" - Tabla.SelectRows("Añadido Custom1", cada uno ([Personalizado] - 1)),
"Columnas eliminadas" - Tabla.RemoveColumns("Filas filtradas", "índice", "ID.1", "Max"-)
En
"Columnas eliminadas"
Básicamente crea un índice para cada ID y filtro al valor máximo para cada ID.
Espero que te ayude,
Ricardo