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

如何在保留行数不变的前提下完成Power Query聚合计算?

问题

现有橙色的两列表(ID、VAL),需要生成蓝色的三列:

  • 列ND_ID:每组ID的索引(从1开始)
  • 列CNT_ID:每组ID的行数(长度)
  • 列SUM_VAL:每组VAL的求和值

目前已通过以下Power Query代码生成ND_ID,但希望在单个查询内生成另外两列,无需复制查询聚合后再左合并:

let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText("i45WclTSUTJSitWBsIzhLHMwywnIMoWzDMEsZyDLQik2FgA=", BinaryEncoding.Base64),
        Compression.Deflate
      )
    ),
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [ID = _t, VAL = _t]
  ),
  Types = Table.TransformColumnTypes(Source, {{"ID", type text}, {"VAL", Int64.Type}}),
  Group = Table.Group(
    Types,
    {"ID"},
    {{"ALL", each _, type table [ID = nullable text, VAL = nullable number]}}
  ),
  Index = Table.AddColumn(Group, "COL", each Table.AddIndexColumn([ALL], "N_ID", 1)),
  Expand = Table.ExpandTableColumn(Index, "COL", {"N_ID"}, {"N_ID"}),
  Delete = Table.RemoveColumns(Expand, {"ALL"})
in
  Delete
解决方案

可以在分组时直接计算每组的长度和VAL求和,再将这些值批量添加到分组后的子表中,最后一次性展开所有目标列,实现单查询完成需求:

let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText("i45WclTSUTJSitWBsIzhLHMwywnIMoWzDMEsZyDLQik2FgA=", BinaryEncoding.Base64),
        Compression.Deflate
      )
    ),
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [ID = _t, VAL = _t]
  ),
  Types = Table.TransformColumnTypes(Source, {{"ID", type text}, {"VAL", Int64.Type}}),
  // 分组时同时计算每组的行数、VAL求和,保留原表数据
  Group = Table.Group(
    Types,
    {"ID"},
    {
      {"ALL", each _, type table [ID = nullable text, VAL = nullable number]},
      {"CNT_ID", each Table.RowCount(_), Int64.Type},
      {"SUM_VAL", each List.Sum([VAL]), Int64.Type}
    }
  ),
  // 给子表添加组内索引,并将分组计算的CNT_ID、SUM_VAL添加到子表每一行
  AddColumnsToSubTable = Table.AddColumn(Group, "ExpandedData", each 
    Table.AddIndexColumn([ALL], "ND_ID", 1)
    |> Table.AddColumn("CNT_ID", each [CNT_ID])
    |> Table.AddColumn("SUM_VAL", each [SUM_VAL])
  ),
  // 展开子表中的所有目标列
  ExpandColumns = Table.ExpandTableColumn(AddColumnsToSubTable, "ExpandedData", {"VAL", "ND_ID", "CNT_ID", "SUM_VAL"}),
  // 清理中间列
  CleanUp = Table.RemoveColumns(ExpandColumns, {"ALL"})
in
  CleanUp

关键说明

  1. 分组阶段:在Table.Group中新增两个聚合逻辑:
    • CNT_ID:用Table.RowCount(_)获取每组的总行数
    • SUM_VAL:用List.Sum([VAL])计算当前组的VAL总和
  2. 子表批量赋值:给子表添加索引后,通过Table.AddColumn将当前组的CNT_ID和SUM_VAL同步到子表的每一行
  3. 一次性展开:直接展开包含所有目标列的子表,无需额外合并操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:45:10