如何在Power Query中基于ID的STATUS条件创建自定义列?
Power Query 实现"STATUS CHECK"自定义列方案
需求规则
- 同一
ID下只要存在任意一行STATUS值为Terminated,该ID所有行的STATUS CHECK列统一标记为Terminated - 若该
ID下无Terminated状态,STATUS CHECK直接返回原STATUS值
实现方法
方法1:分组+合并(高性能推荐)
适合大数据量场景,仅需一次分组操作,避免重复查询:
let 源 = 你的数据表, // 替换为实际表名或数据源 // 按ID分组,标记该ID是否包含Terminated状态 分组标记 = Table.Group(源, {"ID"}, {{"HasTerminated", each List.Contains([STATUS], "Terminated"), type logical}}), // 合并原表与分组标记表 合并表 = Table.NestedJoin(源, {"ID"}, 分组标记, {"ID"}, "分组数据", JoinKind.LeftOuter), // 展开标记列 展开列 = Table.ExpandTableColumn(合并表, "分组数据", {"HasTerminated"}, {"HasTerminated"}), // 添加目标自定义列 添加STATUS_CHECK = Table.AddColumn(展开列, "STATUS CHECK", each if [HasTerminated] then "Terminated" else [STATUS]), // 移除临时标记列(可选操作) 清理临时列 = Table.RemoveColumns(添加STATUS_CHECK, {"HasTerminated"}) in 清理临时列
方法2:直接列表判断(代码简洁)
代码更直观,但大数据量下性能略低于方法1:
let 源 = 你的数据表, // 替换为实际表名或数据源 // 添加STATUS CHECK列,实时判断当前ID的所有状态 添加自定义列 = Table.AddColumn(源, "STATUS CHECK", (当前行) => let // 获取当前ID对应的所有STATUS值列表 当前ID状态列表 = Table.SelectRows(源, each [ID] = 当前行[ID])[STATUS] in if List.Contains(当前ID状态列表, "Terminated") then "Terminated" else 当前行[STATUS] ) in 添加自定义列
结果验证
运行上述代码后,将得到与示例完全一致的结果:
| ID | STATUS | STATUS CHECK |
|---|---|---|
| A1 | Pending | Terminated |
| A1 | Completed | Terminated |
| A3 | Terminated | Terminated |
| A4 | Completed | Completed |
| A4 | Pending | Pending |
| A2 | Pending | Pending |
| A1 | Terminated | Terminated |
| A2 | Completed | Completed |
| A2 | Completed | Completed |
| A3 | Completed | Terminated |
| A3 | Completed | Terminated |
内容的提问来源于stack exchange,提问作者shashbin30
相关产品推荐
相关产品推荐

