在一组列中查找最接近的值
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_size
和 Sys_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 中的最终输出符合预期,如下图所示:-
如果有帮助,请告诉我!
我需要在整个列的固定设置值中检索最接近的匹配值。
我不能使用 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_size
和 Sys_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 中的最终输出符合预期,如下图所示:-
如果有帮助,请告诉我!