我正在 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 中的前一行? 我应该尝试不同的方法,例如使用列表或其他技术吗?
这是一个逐步的方法,可以变得更加紧凑,这是解决您的问题的最简单的方法:
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