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

在Excel Power Query M语言中按Index计算反向累计值

Power Query M语言实现反向累计值(支持重复/未排序索引)

需求说明

需要为表格每行计算反向累计值Value_Cum,即求和所有索引大于等于当前行Index的Value值,要求兼容Index重复、未排序的场景。

Excel表格中等价的公式为:=SUM(FILTER([Value];[Index]>=[@Index]))

基础示例

输入表格:

IndexValue
12.6
27.6
35.6
46.1

输出表格:

IndexValueValue_Cum
12.621.9
27.619.3
35.611.7
46.16.1

复杂场景示例(重复/未排序Index)

输入表格:

IndexValue
72.3
29.9
63
32.5
109.2
105.9
38
47.2
108.7

预期输出:

IndexValueValue_Cum
72.326.1
29.956.7
6329.1
32.546.8
109.223.8
105.923.8
3846.8
47.236.3
108.723.8

之前错误的尝试

使用以下公式添加自定义列时出现错误(空值为错误结果):

= Table.AddColumn(#"Sorted Rows", "Custom", each List.Sum(List.RemoveFirstN(Source[Value],[Value]-1)))

错误结果表格:

IndexValueValue_CumCustom
29.956.7
3846.815.9
32.546.8
47.236.3
6329.144.5
72.326.1
108.723.8
109.223.8
105.923.8

正确实现方案

方案1:逐行筛选求和(直观易懂)

直接模拟Excel的FILTER+SUM逻辑,每行筛选出所有Index≥当前行Index的Value后求和:

= Table.AddColumn(源, "Value_Cum", each List.Sum(Table.SelectRows(源, (r) => r[Index] >= [Index])[Value]))

方案2:预计算分组累计值(性能更优,大数据量推荐)

如果数据量较大,逐行筛选会重复遍历表格,效率较低。可先按Index降序排序计算累计和,再分组保留每个Index对应的累计值,最后合并回原表:

let
    源 = 你的数据源,
    // 按Index降序排序
    排序 = Table.Sort(源,{{"Index", Order.Descending}}),
    // 添加累计和列
    添加累计和 = Table.AddColumn(排序, "累计和", each List.Sum(List.FirstN(排序[Value], Table.PositionOf(排序, _) + 1))),
    // 按Index分组,取每个Index对应的累计和(同Index行的累计值一致)
    分组 = Table.Group(添加累计和, {"Index"}, {{"Value_Cum", each List.First(_[累计和]), type number}}),
    // 合并回原表
    合并 = Table.NestedJoin(源, {"Index"}, 分组, {"Index"}, "分组", JoinKind.LeftOuter),
    // 提取Value_Cum并移除辅助列
    提取列 = Table.ExpandTableColumn(合并, "分组", {"Value_Cum"}, {"Value_Cum"})
in
    提取列

方案3:使用List.Accumulate构建映射(高效简洁)

通过一次遍历构建每个Index对应的反向累计值映射,再添加列:

let
    源 = 你的数据源,
    // 获取唯一Index并降序排序
    唯一索引降序 = List.Sort(List.Distinct(源[Index]), Order.Descending),
    // 计算每个Index对应的反向累计值
    累计映射 = List.Accumulate(唯一索引降序, [], (state, current) => 
        let
            当前组值 = Table.SelectRows(源, (r) => r[Index] = current)[Value],
            当前组和 = List.Sum(current组值),
            累计和 = if List.IsEmpty(state) then 当前组和 else state{0}[累计和] + 当前组和
        in
            {{Index=current, Value_Cum=累计和}} & state
    ),
    // 转成表格
    累计表 = Table.FromRecords(累计映射),
    // 合并回原表
    合并 = Table.NestedJoin(源, {"Index"}, 累计表, {"Index"}, "累计表", JoinKind.LeftOuter),
    提取列 = Table.ExpandTableColumn(合并, "累计表", {"Value_Cum"}, {"Value_Cum"})
in
    提取列

内容的提问来源于stack exchange,提问作者VBAEnthusiast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:42:56