在PQ中,遍历函数像List.Transform函数,List.TransformMany函数以及LTable.TransformColumns函数等等。这里的List.Accumulate是一个迭代函数,是对一个函数返回迭代,直到得到相应的结果。
官方的解释是:使用accumulator从列表List中的项累积汇总值。可以设置可选的种子参数seed。
说人话:指定一个List列表,一个规则即迭代器和一个初始值,按迭代器规则使用List列表中的元素迭代初如值,返回最后一次迭代结束后的初始值。语法如下:
List.Accumulate ( 指定的List列表as list,初始值 as any,迭代器 as function ) as any
官方解释中,迭代器是一个由两个参数组成的函数,(state,current)=>,但是参数有些长,一般情况下可以简写成(x,y)=>或者其他的单个字母的情况。
List.Accumulate ( 指定的List列表as list,初始值 as any,(x,y)=> ) as any
x是指初始值,y是指要迭代的List列表; 传递符号后面的就是迭代的方式
一般来说,该函数的第二个参数,即初始值的类型会决定该函数返回结果的类型,在不做任何类型转换的情况下。比如第二个参数是一个数字,那么迭代的结果就是一个数字,如果第二个参数是一个list,那么迭代的结果就是一个list,如果是一个table,那么迭代的结果就是一个taable。
来看一个例子。
这是一个计算0到9的累计的公式。具体解读一下:
指定的List列表为,初始值为0,迭代器为(x,y)=>,迭代的规则为 x+y .所以有:x表示这里的当前值,即0,y表示指定的列表。准确地来说:List.Accumualte函数在对列表List进行迭代时,为方便讲解,我们将x+y的值记为s.则:
所以最终的结果返回的是45.
这就是整个List.Accumulate迭代的整个过程。在这个过程中,迭代器根据规则迭代List列表后的结果将作为第二次迭代的当前值,直到List列表参数迭代结束,才会返回最后迭代的当前的值。
总结来看,设fx=x+y,上述的过程就是:
处于一直嵌套的过程中。即:
再来看一个例子。
相当于我们把中的每一个元素分成9次,分别使用这个里面的每个元素对{}进行迭代,迭代的规则是x&,说人话就是将List列表中的元素装进初始值{}这个空的容器中。
上述的例子返回了一个值,如果要把上述的例子做成一个List列表的累加的话。公式该如何写?
例1:累计求和
例2:累计连接
例3:批量替换
例4:生成工资条
在讲List.Zip函数的时候,我们使用常规的一个方法生成了关于工资条的方法,但是代码有些长,常规的方法也比较麻烦,这节案例我们使用List.Accumulate函数来制作工资条。
例5:批量匹配求值
让我看看,是哪个小可爱翻到惊喜了~~
小必老师近期新出版的《Excel商务智能:Power Query和Power Pivot数据清洗、建模与分析实战》一书,在上市以来就取得不俗的表现,豆瓣上更是有了9.5分的评分。本书有50+的实战案例,有1G+的随书重难点章节的配套视频。主要讲解Power Query中的M和Power Pivot中的DAX,适用于Excel和Power BI。
领取专属 10元无门槛券
私享最新 技术干货