在一组列中查找最接近的值

Finding the nearest value in a set of a column

我需要在整个列的固定设置值中检索最接近的匹配值。

我不能使用 VBA,最好在 M 或 powerquery 中的计算列中编写脚本,以便可以在 Power BI 中复制结果。

必须匹配的值集如下所示

| preceding column | Sys_size | 
===============================
| ...              |     null |
| ...              |        7 |
| ...              |        9 |
| ...              |       12 |
| ...              |       15 |
| ...              |       17 |
| ...              |     null |

简而言之,上面的列表是可变的(可以添加或更改更多尺寸),并且包含 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 匹配 User_size 输入。请注意,如果用户的值正好落在两个 Sys_size 值之间,则结果会向上舍入。

这是在查询编辑器中执行此操作的一种方法:

首先,添加一个自定义列,为 Users table:

的每一行计算 User_sizeSys_size 之间的最小距离
= Table.AddColumn(PreviousStepNameHere, "Dist",
  (U) => List.Min(List.Transform(List.RemoveNulls(System[Sys_size]),
                                 each Number.Abs(_ - U[User_size]))))

一旦你有了它,你就可以在 Sys_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 if,而只使用 else [User_size] - [Dist]。)

就像@Alexis Olson 在他的回答中提到的那样,使用 DAX 查询更容易实现。

假设:- 你有两个 table,其中一个 table 有 Sys_size,另一个有 User_Size.

让我们使用 DAX 来创建我们需要的东西:-

第 1 步:- 在建模选项卡上:- 单击 "New Table"

Table1= SELECTCOLUMNS(TableNameofSys_Size,"Sys_Size",TableNameofSys_Size[Sys_size]) 
Table2= SELECTCOLUMNS(TableNameofUser_Size,"User_Size",TableNameofSys_Size[User_size]) 
ReqTable = CROSSJOIN(Table1,Table2)                                                                          

第 2 步:- 在 ReqTable

上创建计算列,如下所示
Sys_sizeNew = IF(ISBLANK(ReqTable[Sys_size]),0,ReqTable[Sys_size])
Diff = ABS(ReqTable[Sys_sizeNew] - ReqTable[User_size])

第 3 步:- 在 ReqTable 上创建如下度量。

Req System Value = CALCULATE(SELECTEDVALUE(ReqTable[Sys_sizeNew],MAX(ReqTable[Sys_sizeNew])),FILTER(ReqTable, ReqTable[Diff] = MIN(ReqTable[Diff])))

Step4 :- Join ReqTable 和 Table2 如图 .

因此,table 中的最终输出符合预期,如下图所示:-

如果有帮助,请告诉我!