Power Query分组后仅在特定重复场景下过滤的实现方法咨询
现有数据表
| Insurance Claim No | Subcategory Code | Approval Date | Vendor Name |
|---|---|---|---|
| IE0225873 | I_REP_DAM | 12.10.2022 | XERO |
| IE0225873 | I_OTHER | 12.10.2022 | NERO |
| IE0225874 | I_REP_DAM | 12.10.2022 | XERO |
| IE0225874 | I_OTHER | 13.10.2022 | NERO |
| IE0225874 | I_OTHER | 12.10.2022 | NERO |
| IE0225875 | I_INS | 20.10.2022 | XERO |
| IE0225875 | I_REP_DAM | 20.10.2022 | NERO |
| IE0225876 | I_DAM | 20.11.2022 | XERO |
| IE0225876 | I_REP | 30.12.2022 | NERO |
期望数据表
| Insurance Claim No | Subcategory Code | Approval Date | Vendor Name |
|---|---|---|---|
| IE0225873 | I_REP_DAM | 12.10.2022 | XERO |
| IE0225874 | I_REP_DAM | 12.10.2022 | XERO |
| IE0225874 | I_OTHER | 13.10.2022 | NERO |
| IE0225875 | I_REP_DAM | 20.10.2022 | NERO |
| IE0225876 | I_DAM | 20.11.2022 | XERO |
| IE0225876 | I_REP | 30.12.2022 | NERO |
需求说明
按Insurance Claim No分组后:
- 同一分组内,若同一Approval Date对应多条记录,仅保留
Subcategory Code为I_REP_DAM的行 - 同一分组内,若某Approval Date仅对应一条记录,保留该行即可
遇到的问题
尝试用Group By统计重复日期行数,但分组后无法关联Subcategory Code字段导致过滤逻辑失效;不含Vendor Name时可通过条件列+分组求和解决,但包含该字段后无法实现,求可行方案。
解决方案
方法1:可视化界面操作(适合新手)
标记目标编码行
在Power Query编辑器中,点击「添加列」→「自定义列」,输入公式:= [Subcategory Code] = "I_REP_DAM"将列名改为
IsTargetCode,这列会用True/False标记当前行是否是需要优先保留的I_REP_DAM记录。分组统计重复日期
选中Insurance Claim No和Approval Date两列,点击「转换」→「分组依据」,设置两个分组规则:- 新列名
DateCount,操作选「行计数」(统计当前索赔号+日期下的记录总数) - 新列名
HasTargetCode,操作选「最大值」,列选IsTargetCode(判断当前组合下是否存在目标编码)
点击确定后得到分组统计结果。
- 新列名
关联统计结果到原表
点击「开始」→「合并查询」→「合并查询」,选择原表(左侧)和分组后的表(右侧),匹配列选Insurance Claim No和Approval Date,连接类型选「左外部」。
展开合并后的GroupedData列,只勾选DateCount和HasTargetCode两个字段。过滤符合条件的行
点击「开始」→「筛选行」→「自定义筛选」,输入过滤条件:([DateCount] = 1) or ([DateCount] > 1 and [IsTargetCode] = true)逻辑:要么该日期在当前索赔号下仅1条记录直接保留;要么日期重复但当前行是目标编码才保留。
清理辅助列
选中IsTargetCode、DateCount、HasTargetCode三列右键删除,即可得到期望结果。
方法2:直接使用M代码(高效快捷)
将以下代码替换原查询的M代码(注意把Source替换为你的数据源步骤名):
let Source = 你的数据源, // 添加目标编码标记列 AddTargetFlag = Table.AddColumn(Source, "IsTargetCode", each [Subcategory Code] = "I_REP_DAM"), // 按索赔号+日期分组,统计记录数和是否存在目标编码 Grouped = Table.Group(AddTargetFlag, {"Insurance Claim No", "Approval Date"}, { {"DateCount", each Table.RowCount(_), Int64.Type}, {"HasTargetCode", each List.Max([IsTargetCode]), logical} }), // 合并统计结果到原表 Merged = Table.NestedJoin(AddTargetFlag, {"Insurance Claim No", "Approval Date"}, Grouped, {"Insurance Claim No", "Approval Date"}, "GroupedData", JoinKind.LeftOuter), // 展开统计字段 Expanded = Table.ExpandTableColumn(Merged, "GroupedData", {"DateCount", "HasTargetCode"}, {"DateCount", "HasTargetCode"}), // 过滤符合条件的行 Filtered = Table.SelectRows(Expanded, each ([DateCount] = 1) or ([DateCount] > 1 and [IsTargetCode] = true)), // 删除辅助列 Cleaned = Table.RemoveColumns(Filtered, {"IsTargetCode", "DateCount", "HasTargetCode"}) in Cleaned
核心逻辑说明
通过同时按索赔号和日期分组,精准统计每个索赔号下每个日期的重复次数;标记目标编码行后,把统计结果关联到每一行,既实现了过滤逻辑,又完整保留了Vendor Name等所有原字段。
内容的提问来源于stack exchange,提问作者Dominik

