如何在Power Query中基于分组值计算下一阶段日期?
在Power Query(M语言)中实现获取下一阶段日期的计算列
核心逻辑
按ID1和ID2分组,对每组内的行按Stage Order排序后,为每行匹配下一行的日期值;若组内仅1条记录,则对应计算列留空。
完整M语言实现方案
假设你的数据源表名为Source,直接替换后即可运行:
let Source = 你的数据源, // 按ID1、ID2分组,同时对每组内数据按Stage Order升序排序 GroupedRows = Table.Group(Source, {"ID1", "ID2"}, { {"GroupedData", each Table.Sort(_, {"Stage Order", Order.Ascending}), type table} }), // 为每个分组添加下一阶段日期列 AddNextStageDate = Table.TransformColumns(GroupedRows, { {"GroupedData", (tbl) => let RowCount = Table.RowCount(tbl), // 添加索引列用于匹配下一行 WithIndex = Table.AddIndexColumn(tbl, "RowIndex", 0, 1), // 左连接自身,关联索引+1的行 Merged = Table.NestedJoin(WithIndex, {"RowIndex"}, WithIndex, {"RowIndex"}, "NextRow", JoinKind.LeftOuter), // 提取下一阶段日期,最后一行留空 AddedDate = Table.AddColumn(Merged, "下一阶段日期", each if [RowIndex] < RowCount - 1 then [NextRow][日期]{0} else null), // 移除辅助列 CleanedTable = Table.RemoveColumns(AddedDate, {"RowIndex", "NextRow"}) in CleanedTable } }), // 展开分组表得到最终结果 ExpandedTable = Table.ExpandTableColumn(AddNextStageDate, "GroupedData", {"Stage Order", "日期", "下一阶段日期"}, {"Stage Order", "日期", "下一阶段日期"}) in ExpandedTable
代码细节说明
- 分组排序:先按
ID1和ID2聚合,同时确保每组内的阶段按顺序排列,避免日期匹配错位。 - 索引匹配:通过添加索引列,将表与自身左连接,精准定位当前行的下一条记录。
- 空值处理:判断当前行是否为组内最后一行,若是则返回空值,否则提取下一行的日期。
- 性能优化:分组处理的方式比逐行筛选更高效,适合大数据量场景。
简化版(小数据集适用)
如果数据量较小,也可以直接添加自定义列实现,无需分组:
let Source = 你的数据源, AddedNextDate = Table.AddColumn(Source, "下一阶段日期", (currentRow) => let // 筛选同ID组合且阶段顺序更大的记录 FilteredRows = Table.SelectRows(Source, (row) => row[ID1] = currentRow[ID1] and row[ID2] = currentRow[ID2] and row[Stage Order] > currentRow[Stage Order] ), // 排序后取第一条的日期,无结果则返回空 SortedRows = Table.Sort(FilteredRows, {"Stage Order", Order.Ascending}), NextDate = if Table.RowCount(SortedRows) > 0 then SortedRows[日期]{0} else null in NextDate ) in AddedNextDate
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

