如何在Power Query中快速计算累计和?优化List.Generate性能
快速生成batchId的Power Query实现方法
针对你用List.Generate计算累计和速度过慢的问题,推荐使用List.Scan替代,它是Power Query中专门用于高效累计计算的函数,内部做了性能优化,比逐行迭代的List.Generate快得多。
具体步骤(M代码示例)
假设你的原始表格已包含batchChange列(1表示新批次起始,0表示延续):
- 先缓冲表格减少重复读取开销:
bufferedTable = Table.Buffer(Source) - 提取
batchChange列的列表:changeList = bufferedTable[batchChange] - 用List.Scan计算累计批次ID,初始值设为0,每一步累加当前的
batchChange值:batchIdList = List.Scan((accumulator, currentChange) => accumulator + currentChange, 0, changeList) - 将计算好的批次ID列表合并回原表格:
finalTable = Table.FromColumns( Table.ToColumns(bufferedTable) & {batchIdList}, Table.ColumnNames(bufferedTable) & {"batchId"} )
为什么这个方法更快?
List.Generate是逐行迭代处理,每一步都要单独计算并生成结果;而List.Scan是基于向量式的批量计算,Power Query内部对这类操作做了针对性优化,处理6000行数据基本是毫秒级完成。
如果你的batchChange第一行是1,生成的batchId会从1开始,正好对应第一个批次;如果第一行是0,batchId会从0开始,你可以根据需求调整List.Scan的初始值(比如改成1)。
内容的提问来源于stack exchange,提问作者AmirSina Mashayekh
相关产品推荐
相关产品推荐

