M - 将累积值(运行总计)转换为实际值

M O*_*ell 1 excel m powerquery

用户收到月度客户报告,其中包含月度销售总额(几万行)。销售额显示为总销售额,我试图找到一个 powerquery 解决方案来获得实际销售额作为 (*Required*) 输出:

???????????????????????????????????????????????
? Year ? Month ? StoreID ? Sales ? *Required* ?
???????????????????????????????????????????????
? 2017 ?    10 ?       1 ?     5 ?          5 ?
? 2017 ?    11 ?       1 ?    11 ?          6 ?
? 2017 ?    12 ?       1 ?    18 ?          7 ?
? 2017 ?    11 ?       2 ?    10 ?         10 ?
???????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

在 tSQL 我会做类似的事情

Sales - LAG(Sales,1,0)OVER(Partiton by Year, StoreID Order by Month)
Run Code Online (Sandbox Code Playgroud)

A simular question (but in reverse) was answers,但建议的解决方案看起来相当于交叉连接。我是 powerquery 的新手(所以我可能会误解)但我看不出这是可行的,因为数据集每个月都在增长。有没有更好的方法来解决这个问题,我在“M”中找不到一个例子?

编辑:List.Range 看起来很有希望

Mar*_*eug 5

实际上,您需要当前行上一行的值。一种常见的方法是添加 2 个索引列,一个从 0 开始,另一个从 1 开始。接下来,使用索引列作为连接列将表与其自身合并。从嵌套表中展开所需的列后,您可以添加具有所需计算的自定义列。

let
    Source = Sales,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Index.1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1",{"Index"},#"Added Index1",{"Index.1"},"Previous",JoinKind.LeftOuter),
    #"Expanded Previous" = Table.ExpandTableColumn(#"Merged Queries", "Previous", {"StoreID", "Sales"}, {"Previous.StoreID", "Previous.Sales"}),
    #"Sorted Rows" = Table.Sort(#"Expanded Previous",{{"Index", Order.Ascending}}),
    #"Added Custom" = Table.AddColumn(#"Sorted Rows", "Required", each [Sales] - (if [StoreID] = [Previous.StoreID] then [Previous.Sales] else 0), Int64.Type),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Index.1", "Previous.StoreID", "Previous.Sales"})
in
    #"Removed Columns"
Run Code Online (Sandbox Code Playgroud)