如何在Power Query中查找同列最接近值并返回跨表对应值
Power Query 查找最接近目标值并返回关联内容实现方法
核心逻辑和你在Excel里写的公式逻辑完全一致:遍历查找表的数值列,计算每个值和目标值的绝对差值,找到差值最小的项所在位置,再提取对应位置的关联列内容即可。
基础实现说明
假设你有两张表:
- 查找表(即你代码中的
#"TABLE 2"):包含数值列Value、待返回的关联分类列Category - 目标表:包含需要匹配的目标值列,你需要为每一行目标值匹配最接近的分类
1. 固定单目标值匹配写法
如果只需要匹配单个固定目标值(比如你举例的29),可以直接用以下代码:
let 目标值 = 29, // 遍历查找表Value列,计算每个值和目标值的绝对差 差值列表 = List.Transform(#"TABLE 2"[Value], (x) => Number.Abs(x - 目标值)), // 定位最小差值在列表中的位置 最小差索引 = List.PositionOf(差值列表, List.Min(差值列表)), // 提取对应位置的分类值 匹配结果 = #"TABLE 2"[Category]{最小差索引} in 匹配结果
以你举的例子验证:查找表Value列存20、25、30时,计算得到的差值列表为{9,4,1},最小差值1对应的索引为2,对应Category列的取值就是C,完全符合预期。
2. 批量匹配目标表每行值的写法
如果需要给目标表新增列,逐行匹配对应目标值的最接近分类,直接在「添加自定义列」时输入以下公式即可,注意把公式里的[你的目标值列名]替换成你目标表里存目标值的实际列名:
= let 当前目标值 = [你的目标值列名], 差值列表 = List.Transform(#"TABLE 2"[Value], (x) => Number.Abs(x - 当前目标值)), 最小差索引 = List.PositionOf(差值列表, List.Min(差值列表)) in #"TABLE 2"[Category]{最小差索引}
报错原因说明
你之前运行报错的核心原因是:直接将Number.Abs(xxx)传入List.PositionOf时,仅计算了单个值的绝对值,没有遍历查找表整列计算所有值和目标值的差值,自然无法定位到正确的匹配位置,通过List.Transform完成整列遍历计算后即可正常运行。
注意:如果存在两个数值和目标值的绝对差完全相等(比如目标值27,查找值25和29的差值均为2),上述写法默认返回查找表中排在更靠前的数值对应的分类,和Excel中MATCH函数的默认行为一致。
大数据量优化写法
如果你的查找表数据量在万行以上,可使用以下写法减少一次列表遍历,提升运行效率:
= let 当前目标值 = [你的目标值列名], 带索引差值 = List.Transform(#"TABLE 2"[Value], (v, idx) => [差 = Number.Abs(v - 当前目标值), 行索引 = idx]), 最小差项 = List.Min(带索引差值, (a, b) => Value.Compare(a[差], b[差])) in #"TABLE 2"[Category]{最小差项[行索引]}
内容的提问来源于stack exchange,提问作者maisie
相关产品推荐
相关产品推荐

