在PQ里面如何实现嵌套循环

在Power query里面如何实现嵌套循环呢?我们知道一层的循环List.Generate就能产生。如:

= List.Generate(()=>1,each _<=9,each _+1)

那么像我们vba或者其他语言里面的 for i=1 to 9, for j=1 to 9 这种形式的双层嵌套该如何在power query里面实现呢?

两层/双重嵌套循环套路公式如下:

NestedLoop = (firstloop, secondloop) =>
     List.Generate(()=>[i=1, j=1],each [i] <= firstloop,
  each if [j] <secondloop then [i=[i], j=[j]+1] else [i=[i]+1, j=1],each {[i],[j]})

下面我们来理解下。参数firstloop,sencondloop分别是第一层和第二层循环的最大边界(ubound/upperbound)。List.Generate的第三参数我们来理解下。这个是处理第二层循环的关键之处。当j循环小于upperbound的时候这时候相当于在第一层循环维持一个值不变时候,对第二层进行循环。所以此时是第一层的i=[i]保持原值不变。第二层的j=[j]+1保持递增循环。else处理的是当第二层达到循环的最大边界(upperbound)的时候,开始将第一层循环的i增加一个值,进行下一个第一层循环。而j得回到第二层的循环的最小边界值(lowerbound).进行下一次循环。以此继续到条件不满足结束整个循环。

理解了上面的,我们来做一个9*9的乘法口诀表。大家来试试,我来上自己的代码:

let
    NestedLoop = (firstloop, secondloop) =>
     List.Generate(()=>[i=1, j=1],each [i] <= firstloop,
  each if [j] <secondloop then [i=[i], j=[j]+1] else [i=[i]+1, j=1],each Text.Format("#{0} * #{1} = #{2}",{[i],[j],[i]*[j]})),
    源 = NestedLoop(9,9)
in
    源

输出结果如下图,写法是比较灵活的。81项没错吧:

当然这是用List.Generate产生的。还有一个使用List.TransformMany来产生。此函数的语法:

List.TransformMany(list as list, collectionTransform as Function, resultTransform as Function) as list
公式里面的x代表第一参数,y则是第二函数返回的应用元素。这个就比LIst.Generate要简单不少了。上面的9*9的乘法口诀可以写成如下:

= List.TransformMany({1..9},each {1..9},(x,y)=>Text.Format("#{0} * #{1} = #{2}",{x,y,x*y}))

至于更多层的循环这种就要好好了解下递归了。有兴趣的可以了解下scope identifier @,这个用于power query递归。有兴趣深入的可以找找相关内容,先写到这里吧。

猜你喜欢

转载自blog.csdn.net/qq_24499417/article/details/86354157
今日推荐