Power Query自定义列:引用上一行实现IF逻辑的技术求助
在Power Query中实现分组累加辅助列
核心逻辑
当Site、Room、Cubicle任意一列与上一行不同时,辅助值加1;初始值为1,和你Excel公式的逻辑完全对齐。
方法一:用List.Accumulate高效实现(推荐)
这种方法只遍历数据一次,性能更优,适合大数据量:
- 打开Power Query编辑器,选中你的数据源表
- 点击「高级编辑器」,替换现有代码为以下内容(注意把
Source换成你的实际表名,Site/Room/Cubicle换成你的列名):let Source = 你的数据源表, // 替换成实际的数据源引用 // 将表转为记录列表,方便逐行处理 RowRecords = Table.ToRecords(Source), // 累加计算辅助值 AccumulateResult = List.Accumulate( List.Skip(RowRecords, 1), // 从第二行开始遍历 // 初始状态:第一行辅助值为1,记录上一行数据 [PrevRow = RowRecords{0}, Counter = 1, ResultList = {1}], (currentState, nextRow) => let // 判断当前行和上一行的三个列是否完全一致 IsSameGroup = currentState[PrevRow][Site] = nextRow[Site] and currentState[PrevRow][Room] = nextRow[Room] and currentState[PrevRow][Cubicle] = nextRow[Cubicle], // 更新计数器 NewCounter = if IsSameGroup then currentState[Counter] else currentState[Counter] + 1 in [ PrevRow = nextRow, Counter = NewCounter, ResultList = currentState[ResultList] & {NewCounter} ] ), // 提取辅助值列表并合并到原表 FinalTable = Table.FromColumns( Table.ToColumns(Source) & {AccumulateResult[ResultList]}, Table.ColumnNames(Source) & {"辅助值"} ) in FinalTable
方法二:分步操作(直观易理解)
适合新手快速上手,数据量小时可用:
添加索引列:
转到「添加列」→「索引列」→ 选择「从1开始」添加自定义列:
点击「添加列」→「自定义列」,输入以下公式(注意替换列名和表名):= if [索引] = 1 then 1 else if (你的表名{[索引]-2}[Site] = [Site] and 你的表名{[索引]-2}[Room] = [Room] and 你的表名{[索引]-2}[Cubicle] = [Cubicle]) then #"添加的索引"{[索引]-2}[辅助值] else #"添加的索引"{[索引]-2}[辅助值] + 1注意:这里索引从1开始,所以上一行的列表索引是
[索引]-2(Power Query列表索引默认从0开始)
关键提示
Power Query是函数式编程模型,不能像Excel那样直接引用单元格,所以必须通过列表累加或索引查找的方式实现“引用上一行”的逻辑。List.Accumulate是处理这类逐行依赖计算的最优方案,能避免重复查找带来的性能损耗。
内容的提问来源于stack exchange,提问作者Jess Bess JessBess
相关产品推荐
相关产品推荐

