PowerQuery算法需求:线缆发放与路线匹配的自动匹配逻辑开发求助
解决PowerQuery中线缆与路线匹配问题的方案
核心思路
无需循环,利用PowerQuery集合运算逻辑,为每条路线筛选出大于等于路线长度的最短线缆;若不存在符合条件的线缆,则标记错误。
具体操作步骤
假设你的两个表分别为发放线缆表(含线缆长度列)和明细分解表(含路线长度列,需生成实际使用线缆列)
整理基础数据
- 确保两个表的长度列均为数值类型:选中对应列,在「转换」选项卡选择「数据类型」→「小数/整数」
- 对
发放线缆表按线缆长度升序排序:选中线缆长度列,点击「开始」选项卡的「升序排序」按钮
关联所有线缆候选选项
- 选中
明细分解表,点击「开始」→「合并查询」→「合并查询作为新查询」 - 合并窗口中,右侧选择
发放线缆表,关联条件选择无匹配条件(生成笛卡尔积,让每条路线对应所有线缆),点击确定
- 选中
筛选符合长度要求的线缆
- 在合并后的新查询中,展开
发放线缆表的线缆长度列,重命名为候选线缆长度 - 添加自定义列,公式:
= if [候选线缆长度] >= [路线长度] then [候选线缆长度] else null,命名为符合条件的线缆 - 筛选
符合条件的线缆列,移除空值(仅保留满足长度要求的线缆)
- 在合并后的新查询中,展开
分组提取最短符合条件线缆
- 按
路线长度(或明细分解表的唯一标识列)分组,操作选择「所有行」,命名为分组结果 - 添加自定义列,提取每组中最小的符合条件线缆:
= List.Min([分组结果][符合条件的线缆]),命名为实际使用线缆 - 展开分组前的原始列,删除
分组结果、候选线缆长度等中间列
- 按
标记错误情况
- 添加自定义列,公式:
= if [实际使用线缆] = null then "无可用线缆(错误)" else [实际使用线缆],替换原实际使用线缆列即可
- 添加自定义列,公式:
简化方案(自定义函数实现)
若觉得上述步骤繁琐,可通过自定义函数快速实现:
- 在PowerQuery中新建自定义函数,命名为
GetMatchingCable:(routeLength as number) as any => let filteredCables = Table.SelectRows(发放线缆表, each [线缆长度] >= routeLength), result = if Table.RowCount(filteredCables) > 0 then List.Min(filteredCables[线缆长度]) else "无可用线缆(错误)" in result - 返回
明细分解表,添加自定义列,调用函数:= GetMatchingCable([路线长度]),命名为实际使用线缆
以上两种方案均仅使用PowerQuery基础功能,可实现你需要的匹配逻辑——绿色标注的可接受替代方案(最短满足长度的线缆)和红色标记的错误情况(无符合条件线缆)。
内容的提问来源于stack exchange,提问作者MrFloki
相关产品推荐
相关产品推荐

