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

时间:2018-04-09 14:06:04

标签: excel powerbi powerquery m

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

我不能使用VBA,理想情况下将其编写为M或powerquery中的计算列,因此可以在Power BI中复制结果。

必须匹配的值集如下所示

| 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 |

简单地说,它搜索与User_size输入匹配的最近的Sys_size。请注意,如果用户的值恰好落在两个Sys_size值之间,则结果将向上舍入。

2 个答案:

答案 0 :(得分:2)

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

首先,添加一个自定义列,为print ("Sie heben ", geld_a, "€ ab") 表的每一行计算User_sizeSys_size之间的最小距离:

Users

完成后,您可以使用以下公式的自定义列提取= 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。)

答案 1 :(得分:0)

就像@Alexis Olson在他的回答中提到的,使用DAX查询实现起来要容易一些。

假设: - 您有两个表,其中一个表具有Sys_size,另一个表具有User_Size。

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

步骤1: - 在建模选项卡上: - 点击"新表"

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])))

步骤4: - 使用Table2加入ReqTable,如图Relationship Diagram所示。

因此,表中的最终输出与预期匹配,如下图所示: - Final Output

如果有帮助,请告诉我!