如何使用 Power Query 删除行内的重复项?

How do I remove duplicates WITHIN a row using Power Query?

我有这样的数据:

Wire Point1 Point2 Point3 Point4 Point5 Point6
A WP1 WP1 WP2 WP2
B WP3 WP4 WP3 WP4
C WP5 WP5 WP6 WP7 WP6 WP7

(注意每行的不同长度和重复项)

我希望最终结果是:

Wire Point1 Point2 Point3
A WP1 WP2
B WP3 WP4
C WP5 WP6 WP7

删除了重复项,并删除了空格。

这与 =UNIQUE() 函数非常相似,但在 power 查询中不可用。

使用列要容易得多,所以我建议取消旋转 Point 列,删除重复项,然后将其放入您想要的形状。

这是一个完整的查询,您可以将其传递到高级编辑器中以更仔细地查看每个步骤:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUQoPMEQijYAkBIHYsTrRSk5gtjGYNIGzYWpMwGqcwWxTJNIMTJqjsGNjAQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Wire = _t, Point1 = _t, Point2 = _t, Point3 = _t, Point4 = _t, Point5 = _t, Point6 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Wire", type text}, {"Point1", type text}, {"Point2", type text}, {"Point3", type text}, {"Point4", type text}, {"Point5", type text}, {"Point6", type text}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Wire"}, "Attribute", "Value"),
    #"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([Value] <> "")),
    #"Removed Duplicates" = Table.Distinct(#"Filtered Rows", {"Wire", "Value"}),
    #"Grouped Rows" = Table.Group(#"Removed Duplicates", {"Wire"}, {{"Point", each Text.Combine([Value],","), type text}}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Grouped Rows", "Point", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"Point1", "Point2", "Point3"})
in
    #"Split Column by Delimiter"
  • 逆轴
  • 线控分组
    • 汇总到已排序的唯一点列表
  • 计算所有列表中的最大项目数以用于稍后的列拆分器
  • 将点列表提取为分号分隔的字符串
  • 拆分成新的列

M码

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source, List.Transform(Table.ColumnNames(Source), each {_, Text.Type})),

//Unpivot
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Wire"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),

//Group by Wire
//Aggregate by sorted, unique list of Points for each Wire
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Wire"}, {
        {"Point", each List.Sort(List.Distinct([Value]))}}),

//Calculate the Max unique Points for any Wire (for subsequent splitting
maxPoints = List.Max(List.Transform(#"Grouped Rows"[Point], each List.Count(_))),

//Extract the List values into a semicolon separated list
    #"Extracted Values" = Table.TransformColumns(#"Grouped Rows", 
        {"Point", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),

//Then split into new columns using the semicolon delimiter
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "Point", 
        Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv),maxPoints)
        
in 
    #"Split Column by Delimiter"