Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在一组列中查找最近的值_Excel_Powerbi_Powerquery_M - Fatal编程技术网

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

Excel 在一组列中查找最近的值,excel,powerbi,powerquery,m,Excel,Powerbi,Powerquery,M,我需要检索整个列的固定值集中最接近的匹配值 我不能使用VBA,理想的情况是在M中编写脚本,或者在powerquery中编写计算列,以便在Power BI中复制结果 必须匹配的一组值如下所示 | preceding column | Sys_size | =============================== | ... | null | | ... | 7 | | ... |

我需要检索整个列的固定值集中最接近的匹配值

我不能使用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 | 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更容易。您必须在查询编辑器中执行此操作,还是在该步骤后可以执行计算列?