查找与列值最接近的预设值(M/Power Query/Excel求解)
嘿,Sambo!我来帮你搞定这个「从固定值集合里找最匹配近似值」的需求,给你准备了Excel公式和Power Query(M语言)两种实用方案,按需取用就行~
Excel 公式解决方案
假设你的待匹配值在A列,固定的有效Sys_size集合是{7,9,12,15,17},可以用以下公式实现:
基础版(直接匹配)
=INDEX({7,9,12,15,17},MATCH(MIN(ABS(A2-{7,9,12,15,17})),ABS(A2-{7,9,12,15,17}),0))
逻辑拆解:
- 先计算A2的值和每个固定值的绝对差值
- 找到这些差值里的最小值
- 再匹配这个最小值对应的固定值,最终返回它
优化版(处理空值/Null)
如果待匹配列存在空值或Null,不想返回错误值的话,加个IF判断:
=IF(ISBLANK(A2), "", INDEX({7,9,12,15,17},MATCH(MIN(ABS(A2-{7,9,12,15,17})),ABS(A2-{7,9,12,15,17}),0)))
这样空值会返回空字符串,更美观。
Power Query(M语言)解决方案
如果你的数据在Power Query里处理,步骤如下:
方案1:硬编码固定集合
先定义好固定的有效尺寸集合,再添加自定义列计算匹配值:
let // 加载你的数据源 Source = Excel.CurrentWorkbook(){[Name="你的数据表名"]}[Content], // 定义固定的有效Sys_size集合 fixedSizes = {7,9,12,15,17}, // 添加自定义列,计算最匹配的近似值 AddMatchingSize = Table.AddColumn(Source, "匹配的Sys_size", each if [待匹配列名] = null then null else List.Min( List.Transform(fixedSizes, (size) => [Size=size, Diff=Number.Abs([待匹配列名] - size)]), (x) => x[Diff] )[Size] ) in AddMatchingSize
方案2:从现有表格提取固定集合(更灵活)
如果你的固定值集合是来自另一个表格的Sys_size列(需要排除Null),可以这样修改:
let // 加载固定值表格 FixedSizeTable = Excel.CurrentWorkbook(){[Name="固定值表名"]}[Content], // 提取并清理固定值集合(去掉Null) fixedSizes = List.RemoveNulls(Table.Column(FixedSizeTable, "Sys_size")), // 加载待匹配的数据表 Source = Excel.CurrentWorkbook(){[Name="你的数据表名"]}[Content], // 添加自定义列计算匹配值 AddMatchingSize = Table.AddColumn(Source, "匹配的Sys_size", each if [待匹配列名] = null then null else List.Min( List.Transform(fixedSizes, (size) => [Size=size, Diff=Number.Abs([待匹配列名] - size)]), (x) => x[Diff] )[Size] ) in AddMatchingSize
逻辑拆解:
- 先遍历固定集合里的每个值,计算和当前待匹配值的绝对差
- 用
List.Min根据差值找到最小的那一项,返回对应的Size值 - 处理了待匹配值为Null的情况,保持结果一致
内容的提问来源于stack exchange,提问作者Sambo
相关产品推荐
相关产品推荐

