如何在Power Query中引用上一行值实现自定义列逻辑?
Power Query 实现跨行IF逻辑的解决方案
需求说明
需要实现对应Excel公式 =IF(A2 > 0, IF(A2 = A1, 0, A2), A2) 的逻辑:
- 当
Forecast.P6 Forecast列当前值>0时,若与上一行值相同则返回0,不同则返回当前值 - 若当前值≤0,直接返回当前值
示例效果:
| Forecast.P6 Forecast | Forecast P6 |
|---|---|
| 100 | 100 |
| 100 | 0 |
| 200 | 200 |
| 200 | 0 |
| 300 | 300 |
正确实现方法(推荐索引列+移位值)
通过添加唯一索引列,避免重复行导致的位置判断错误,步骤清晰可靠:
M代码示例
let // 替换为你的数据源(比如Excel表、数据库连接等) 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], // 添加从0开始的索引列,确保每行位置唯一 添加索引 = Table.AddIndexColumn(源, "索引", 0, 1, Int64.Type), // 添加上一行值列:索引>0时取上一行的Forecast值,第一行无上行则为null 添加上一行值 = Table.AddColumn(添加索引, "上一行值", each if [索引] > 0 then 添加索引[Forecast.P6 Forecast]{[索引]-1} else null), // 添加自定义列实现逻辑判断 添加结果列 = Table.AddColumn(添加上一行值, "Forecast P6", each if [Forecast.P6 Forecast] > 0 then if [Forecast.P6 Forecast] = [上一行值] then 0 else [Forecast.P6 Forecast] else [Forecast.P6 Forecast]), // 移除临时的索引和上一行值列 清理临时列 = Table.RemoveColumns(添加结果列, {"索引", "上一行值"}) in 清理临时列
高效列表处理方法(适合大数据量)
如果数据量较大,用列表批量操作比逐行判断更高效,无需添加索引列:
M代码示例
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], // 提取原目标列的列表 原列列表 = 源[Forecast.P6 Forecast], // 生成上一行值的列表:原列表去掉第一个元素,前面补null对应第一行 上一行列表 = List.Combine({{null}, List.RemoveFirstN(原列列表, 1)}), // 按逻辑批量生成结果列表 结果列表 = List.Transform(List.Zip({原列列表, 上一行列表}), each if _{0} > 0 then if _{0} = _{1} then 0 else _{0} else _{0}), // 将结果列表映射为原表的新列 添加结果列 = Table.AddColumn(源, "Forecast P6", each 结果列表{Table.PositionOf(源, _)}) in 添加结果列
常见问题说明
- 之前用
Table.PositionOf出错,是因为存在重复行时,该函数会返回第一个匹配行的位置,导致上一行值判断错误,添加索引列可彻底解决此问题 - 移位列表方法需保证列表与原表的行顺序完全一致,否则会出现值对应错误
内容的提问来源于stack exchange,提问作者Wyatt
相关产品推荐
相关产品推荐

