Excel 在一组列中查找最近的值
我需要检索整个列的固定值集中最接近的匹配值 我不能使用VBA,理想的情况是在M中编写脚本,或者在powerquery中编写计算列,以便在Power BI中复制结果 必须匹配的一组值如下所示Excel 在一组列中查找最近的值,excel,powerbi,powerquery,m,Excel,Powerbi,Powerquery,M,我需要检索整个列的固定值集中最接近的匹配值 我不能使用VBA,理想的情况是在M中编写脚本,或者在powerquery中编写计算列,以便在Power BI中复制结果 必须匹配的一组值如下所示 | preceding column | Sys_size | =============================== | ... | null | | ... | 7 | | ... |
| preceding column | Sys_size |
===============================
| ... | null |
| ... | 7 |
| ... | 9 |
| ... | 12 |
| ... | 15 |
| ... | 17 |
| ... | null |
| preceding column | User_size |
================================
| ... | 8.5 |
| ... | 13 |
| ... | 6 |
| ... | 10.5 |
| ... | 18 |
| ... | 14 |
简而言之,上面的列表是可变的(可以添加或更改更多大小),并且包含空值
第二,有一系列变量,如下所示
| preceding column | Sys_size |
===============================
| ... | null |
| ... | 7 |
| ... | 9 |
| ... | 12 |
| ... | 15 |
| ... | 17 |
| ... | null |
| preceding column | User_size |
================================
| ... | 8.5 |
| ... | 13 |
| ... | 6 |
| ... | 10.5 |
| ... | 18 |
| ... | 14 |
我希望在脚本中获得的结果如下所示
| preceding column | User_size | Sys_size |
===========================================
| ... | 8.5 | 9 |
| ... | 13 | 12 |
| ... | 6 | 7 |
| ... | 10.5 | 12 |
| ... | 18 | 17 |
| ... | 14 | 15 |
简单地说,它搜索与用户大小输入匹配的最近的系统大小。请注意,如果用户值正好落在两个Sys_size值之间,则结果将向上取整。在查询编辑器中有一种方法: 首先,添加一个自定义列,用于计算
用户
表中每一行的用户大小
和系统大小
之间的最小距离:
= Table.AddColumn(PreviousStepNameHere, "Dist",
(U) => List.Min(List.Transform(List.RemoveNulls(System[Sys_size]),
each Number.Abs(_ - U[User_size]))))
一旦你有了它,你就可以用一个自定义的列,用下面的公式拉入Sys\u size
:
if List.Contains(System[Sys_size], [User_size] + [Dist])
then [User_size] + [Dist]
else if List.Contains(System[Sys_size], [User_size] - [Dist])
then [User_size] - [Dist]
else null
(如果,您可能可以删除
else,而只使用else[User\u size]-[Dist]
。就像在他的回答中提到的@Alexis Olson一样,使用DAX查询实现这一点更容易一些
假设:-您有两个表,其中一个表的大小为Sys\u,另一个表的大小为User\u
让我们使用DAX来创建我们需要的:-
第1步:-在建模选项卡上:-单击“新建表格”
步骤2:-在ReqTable上创建计算列,如下所示
Sys_sizeNew = IF(ISBLANK(ReqTable[Sys_size]),0,ReqTable[Sys_size])
Diff = ABS(ReqTable[Sys_sizeNew] - ReqTable[User_size])
步骤3:-按照下表创建测量值
Req System Value = CALCULATE(SELECTEDVALUE(ReqTable[Sys_sizeNew],MAX(ReqTable[Sys_sizeNew])),FILTER(ReqTable, ReqTable[Diff] = MIN(ReqTable[Diff])))
步骤4:-将ReqTable与表2连接起来,如图所示
因此,表中的最终输出与预期匹配,如下图所示:-
让我知道,如果它有帮助或没有 这可能有助于您在输入上的系统大小范围是多少?另外,是否可能有8.01或8.1或8.11这样的值?DAX可能比M更容易。您必须在查询编辑器中执行此操作,还是在该步骤后可以执行计算列?