Power Query 学习 04-2 Table.Group 局部分组 数列学习

首先感谢各位大佬的不懈努力和无私分享,没有大家的努力和分享,我的Table.Group肯定还停留在第三参数阶段。有关这个函数的基础用法,请大家参考PQfans相关帖子:https://pqfans.com/836.html 。有关局部分组,也就是第4参数为1时,第五参数的工作原理,请大家参考Ntt的相关帖子:https://pbihub.cn/blog/123 。这里仅对局部分组时,分组数据是数列的分组方法进行总结。


额外说明一下:Table.Group的第2参数,当分组依据只有1列时,可直接使用列标题的文本,此时传递到第5参数的是此列内容的List。但如果第2参数使用List格式,就是在外面加上一对{},即使只有1列,传递到第5参数的数据也会是一个每项都为RecoredList,此时如果要进行比较判断,则需先深化出Record的对应字段值,再进行比较。本文为了简化,第2参数都是使用一列,且使用文本模式。


进入正文,我们先构建一个只有一列,内容1到100的表,对它进行分组。为了方便显示分组结果,此处定义了一个自定义函数,可以把分组的结果,用1-100这种形式来显示,这样便于判断分组结果是否正确,初始第5参数为0,也就是不分组,代码及结果如下:

let
    源 = Table.FromColumns({{1..100}}),
    fx = (x)=>Text.Format("#{0}-#{1}",{List.First(x),List.Last(x)}),
    分组 = Table.Group(源,"Column1",{"a",each fx([Column1])},0,(x,y)=>0)
in
    分组

file
好接下来我们开始研究第5参数的具体算法,首先:

  • 案例1:按1-30,31-60,61-100分组
    要实现分组,我们只需要让y=31y=61时,第5参数返回1就行了,注意此处y=31y=61是或关系。
    file
  • 案例2:每10个数分一组
    也就是,每当y比x大10的时候,返回1重新分组,表达式为:y=x+10
    file
    下面结合前面两种情况:
  • 案例3:按1-30,31-60(每10个数一组),61-100分组
    此时为了避免两边也被分成10个一组,这样就需要在中间这个区域加上区域限定条件。需要注意,此处每个区域条件之间是或关系,而区域内部,则是与的关系,具体代码是:y=31 or (y>31 and y=x+10 and y<61) or y=61
    file
    理解了案例3,我们开始期末考试:
  • 案例4:按1-20(每3个数一组),21-50(每7个数一组),51-80(每13个数一组),81-100分组
    这个貌似有点烧脑,但通过前面的规律总结,我们只要按每一分段的要求,分别写出表达式,并用or连接起来就好了,代码和结果如下:
    let
    源 = Table.FromColumns({{1..100}}),
    fx = (x)=>Text.Format("#{0}-#{1}",{List.First(x),List.Last(x)}),
    分组 = Table.Group(源,"Column1",{"a",each fx([Column1])},0,(x,y)=>Number.From
        (   (y=x+3 and y<21)
            or y=21 
            or (y>21 and y=x+7 and y<51) 
            or y=51
            or (y>51 and y=x+13 and y<81)
            or y=81
        )
    )
    in
    分组

    file
    总结:
    此类复杂连续数字分组看似很难,但只要按照:Number.From( 区域规则 or 断点 or 区域规则 or 断点... )的模式书写第5参数条件,实现起来并不很难。