【问题标题】:Powerquery, sorting grouped rows with a parent column with grouped value in another columnPowerquery,对具有父列的分组行进行排序,该父列在另一列中具有分组值
【发布时间】:2021-02-15 22:23:51
【问题描述】:

我不确定如何解决这个复杂的问题,我需要按组键对表进行排序,但每个所述组都有一个父行,该父行由另一列中的组键标识。

所以在这个例子中,

sku parentsku
200 null
200-1 200
200-2 200
103 null
xxx 103
yyy1 103
yyy3 103
400 null
600 null
601 600
602 600
405 400

我需要得到

sku parentsku
103 null
xxx 103
yyy1 103
yyy3 103
200 null
200-1 200
200-2 200
400 null
405 400
600 null
601 600
602 600

目前无法保证行在任何模式下都靠得很近。

【问题讨论】:

    标签: sorting powerquery


    【解决方案1】:

    一种方法可能是使用Table.Sort 并为comparisonCriteria 参数提供一个自定义函数,用于对行进行排序:

    1. 主要由 SKU(在比较过程中动态确定)
    2. 其次是parentsku 列是否为null
    3. 第三个是sku

    下面的代码尝试做上面描述的事情:

    let
        initialTable = Table.FromRows({
            {"200", null},
            {"200-1", "200"},
            {"200-2", "200"},
            {"103", null},
            {"xxx", "103"},
            {"yyy1", "103"},
            {"yyy3", "103"},
            {"400", null},
            {"600", null},
            {"601", "600"},
            {"602", "600"},
            {"405", "400"}
        }, type table [sku = text, parentsku = text]),
        // Custom sorting behaviour to sort by SKU. If SKUs are equal (for two rows), preference should be given to rows containing a null parent SKU.
        sorted = Table.Sort(initialTable, (x as record, y as record) => 
            let
                xSku = if null <> x[parentsku] then x[parentsku] else x[sku],
                ySku = if null <> y[parentsku] then y[parentsku] else y[sku],
                skusComparison = Value.Compare(xSku, ySku),
                skusAreNotEqual = 0 <> skusComparison,
                parentComparison = if null = x[parentsku] then -1 else if null = y[parentsku] then 1 else Value.Compare(x[sku], y[sku]),
                sorted = if skusAreNotEqual then skusComparison else parentComparison
            in sorted
        )
    in
        sorted
    

    并生成如下表格:

    我认为这符合您的预期输出。

    【讨论】:

    • 这看起来很有希望,我试图了解它是如何工作的......所以我看到 x 和 y 记录是两个函数参数......但是用记录填充它们的是什么?你怎么知道 table.sort 函数会提供它们?这在任何地方都有记录吗?
    • @J.M.Becker,用于排序函数的comparisonCriteria 参数可以采用多种形式,其中一种是函数(就像这里使用的那样)。要查看有关 comparisonCriteria 的详细信息,请参阅 docs.microsoft.com/en-us/powerquery-m/list-sort#about。该链接适用于List.Sort,但该信息也适用于Table.Sort。我相信表可以被认为是记录列表(尽管这是一种简化),因此xy 的类型为record
    【解决方案2】:

    另一种方式:

    let
        Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
        add = Table.AddColumn(Source, "temp", each if [parentsku] = null then [sku] else [parentsku]),
        sort = Table.Sort(add,List.Transform({"temp", "parentsku"}, each {_, 0})),
        del = Table.RemoveColumns(sort,{"temp"})
    in
        del
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2017-04-01
      • 2013-02-05
      • 1970-01-01
      • 2015-03-10
      • 2020-07-02
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多