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

问题描述 投票:0回答:1

我正在 Power Query 中工作,并尝试创建一个模仿以下 Excel 公式的自定义列,我在 mcode 上遇到了困难:

=IF(A2 > 0, IF(A2 = A1, 0, A2), A2)

目标是:

如果 Forecast.P6 Forecast 列中的当前值大于 0: 检查它是否与上一行中的值相同。 如果与上一行的值相同,则返回 0。 如果不是,则返回当前值。 如果当前值小于或等于0,则仅返回当前值。 这是我想要的一个例子:

预测.P6预测 预测P6
100 100
100 0
200 200
200 0
300 300

我尝试过的: 我添加了一个索引列来尝试使用 Table.PositionOf 访问以前的行,但它仍然没有按预期运行。 我尝试添加移位列表(例如 List.RemoveFirstN),但在同一查询中引用值很棘手。

问题: 上面的 M 代码要么返回错误,要么返回表格而不是值。感觉我在 Power Query 处理逐行比较的方式上遇到了设计限制。 我怎样才能正确实现这个逻辑,以便我可以将一个值与前一行的值进行比较?

有什么帮助或建议吗? 有没有更好的方法来引用 Power Query 中的前一行? 我应该尝试不同的方法,例如使用列表或其他技术吗?

powerquery m data-transform
1个回答
0
投票

这是一个逐步的方法,可以变得更加紧凑,这是解决您的问题的最简单的方法:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],

    // Step 1: Add an Index column to reference previous rows
    AddIndex = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),

    // Step 2: Add a column to shift the "Forecast.P6 Forecast" column down by one row
    PreviousRow = Table.AddColumn(AddIndex, "Previous Forecast", each try AddIndex{[Index]-2}[Forecast.P6 Forecast] otherwise null),
    
    // Step 3: Add a new column to compare the values in "Forecast.P6 Forecast"
   Compare = Table.AddColumn(PreviousRow, "Compare", each if [Previous Forecast]=[Forecast.P6 Forecast] then 0 else [Previous Forecast])
in
   Compare
© www.soinside.com 2019 - 2024. All rights reserved.