如何在Power Query中实现多组条件筛选并合并结果(免复制源数据)
在Power Query中复用源数据实现多参数化筛选并合并结果
1. 创建参数化筛选规则表
先建立一个集中管理所有筛选规则的表,后续新增/修改规则只需调整此表,无需重复复制源数据或修改筛选逻辑。规则表结构示例:
| 设备名称 | 允许的From Zone(列表) | 允许的To Zone(列表) |
|---|---|---|
| firewall 1 | {"Internal"} | {} |
| firewall 2 | {"Gateway", "VPN"} | {"DMZ"} |
说明:空列表
{}代表任意值,即不对该列做筛选限制。
2. 编写自定义筛选函数
在Power Query中新建自定义函数,用于判断单条数据行是否符合某一条筛选规则,命名为CheckRowAgainstRule:
= (dataRow as record, filterRule as record) as logical => let // 设备匹配判断 DeviceMatch = dataRow[Device] = filterRule[设备名称], // From Zone判断:规则为空则匹配,否则检查是否在允许列表中 FromZoneMatch = List.IsEmpty(filterRule[允许的From Zone(列表)]) or List.Contains(filterRule[允许的From Zone(列表)], dataRow[From Zone]), // To Zone判断:规则为空则匹配,否则检查是否在允许列表中 ToZoneMatch = List.IsEmpty(filterRule[允许的To Zone(列表)]) or List.Contains(filterRule[允许的To Zone(列表)], dataRow[To Zone]), // 所有条件同时满足则返回true Result = DeviceMatch and FromZoneMatch and ToZoneMatch in Result
3. 应用规则并合并结果
按以下步骤执行:
- 加载你的源数据(命名为
SourceData)和上述筛选规则表(命名为FilterRules)。 - 对
FilterRules执行添加列操作,用自定义函数关联源数据:= Table.AddColumn(FilterRules, "匹配数据", each Table.SelectRows(SourceData, (row) => CheckRowAgainstRule(row, _))) - 展开
匹配数据列,选择保留Device、From Zone、To Zone字段。 - 执行删除重复行操作,避免同一数据行被多条规则匹配后重复出现。
- 整理列顺序,得到最终合并结果。
针对示例数据的验证结果
基于你提供的原始数据,最终合并结果如下:
| Device | From Zone | To Zone |
|---|---|---|
| firewall 1 | Internal | External |
| firewall 1 | Internal | VPN |
| firewall 2 | External | DMZ |
| firewall 2 | VPN | DMZ |
| firewall 2 | Gateway | DMZ |
注:你提供的数据集2示例中存在数据错误(原数据无
firewall 2对应VPN -> Internal、Gateway -> Internal的行),上述为基于原始数据计算的正确结果。
内容的提问来源于stack exchange,提问作者Illya Soykin
相关产品推荐
相关产品推荐

