You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Power Query中引用上一行值实现自定义列逻辑?

Power Query 实现跨行IF逻辑的解决方案

需求说明

需要实现对应Excel公式 =IF(A2 > 0, IF(A2 = A1, 0, A2), A2) 的逻辑:

  • 当Forecast.P6 Forecast列当前值>0时,若与上一行值相同则返回0,不同则返回当前值
  • 若当前值≤0,直接返回当前值

示例效果:

Forecast.P6 ForecastForecast P6
100100
1000
200200
2000
300300

正确实现方法(推荐索引列+移位值)

通过添加唯一索引列,避免重复行导致的位置判断错误,步骤清晰可靠:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:02:41