没有关系的 DAX 最接近值匹配
DAX closest value match with no relationship
我正在尝试将报告从 Excel 迁移到 Power BI,我希望有人能帮助我,因为我是 DAX 的新手。
我有两个 table,其中一个(我们称它为 table A)包含事件的计划开始 Date/Times 列,而另一个包含实际开始 Date/Times 相同的事件。计划和实际开始时间通常只有几分钟的差异。
我需要将 Table B 中最接近的实际开始 Date/Time 与 table A 中的计划开始 Date/Times 相匹配。
没有可用于在两个 table 之间创建关系的现有列。
如果我能找到最接近的实际开始时间并将其拉入 Table A,那么我就可以从中创建关系。
在 Excel 中,我会用这样的数组公式来做到这一点:(这里我只是假设所有内容都在每个 table 的 A 列中)
{=Index(TableB!A:A,match(min(abs(TableB!A:A-TableA!A1)),abs(TableB!:A:A-TableA!A1),0),1)}
我在网上找到了以下 DAX 代码,但它只会 return 下一个最低值,即使有更接近的值也更高。
If (
Hasonevalue ( TableA[A] ),
Calculate (
Max ( TableB[A] ),
Filter ( TableB, TableB[A] <= Values ( TableA[A] ) )
)
)
如果我构建一个 date/time table,它包含我的数据涵盖的日期范围(大约 2 年)的每一分钟,我也试图找出一种方法来做到这一点但正如我所说,我是 DAX 的新手,还没有弄明白。
是否有任何方法可以使用类似于 DAX 中 excel 公式的 (min(abs( 部分(因为它具有这些函数)的方法在计算列中进行计算?这可能没有现有的关系还是我每次要更新此报告时都必须在 Excel 中继续做这部分工作?
非常感谢任何帮助。
在 Planned
table 中创建一个计算列,将其命名为 ActualClosestDate
并使用此表达式:
ActualClosestDate =
IF (
DATEDIFF (
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
[Planned],
SECOND
)
< DATEDIFF (
[Planned],
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
),
SECOND
),
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
)
)
其中:
[Planned]
是表 A 中的计划开始 Date/time 列
[Actual]
是表 B 中的实际开始 Date/Time 列
根据您的型号更换。
如果每个 table 中都没有事件列,请在过滤器函数中抑制该条件。
更新:计算三个不同的列可以提高性能,而不是在一个表达式中执行计算。
BeforePlanned =
DATEDIFF (
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
[Planned],
SECOND
)
AfterPlanned =
DATEDIFF (
[Planned],
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
),
SECOND
)
ActualClosestDate =
IF (
[BeforePlanned] < [AfterPlanned],
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
)
)
您甚至可以将其拆分为更多列,即一列获取上一个实际日期,一列获取下一个实际日期,那么您只需要:
ActualClosestDate =
IF ( [BeforePlanned] < [AfterPlanned], [PreviousActualDate], [NextActualDate] )
如果有帮助请告诉我。
我正在尝试将报告从 Excel 迁移到 Power BI,我希望有人能帮助我,因为我是 DAX 的新手。
我有两个 table,其中一个(我们称它为 table A)包含事件的计划开始 Date/Times 列,而另一个包含实际开始 Date/Times 相同的事件。计划和实际开始时间通常只有几分钟的差异。
我需要将 Table B 中最接近的实际开始 Date/Time 与 table A 中的计划开始 Date/Times 相匹配。
没有可用于在两个 table 之间创建关系的现有列。
如果我能找到最接近的实际开始时间并将其拉入 Table A,那么我就可以从中创建关系。
在 Excel 中,我会用这样的数组公式来做到这一点:(这里我只是假设所有内容都在每个 table 的 A 列中)
{=Index(TableB!A:A,match(min(abs(TableB!A:A-TableA!A1)),abs(TableB!:A:A-TableA!A1),0),1)}
我在网上找到了以下 DAX 代码,但它只会 return 下一个最低值,即使有更接近的值也更高。
If (
Hasonevalue ( TableA[A] ),
Calculate (
Max ( TableB[A] ),
Filter ( TableB, TableB[A] <= Values ( TableA[A] ) )
)
)
如果我构建一个 date/time table,它包含我的数据涵盖的日期范围(大约 2 年)的每一分钟,我也试图找出一种方法来做到这一点但正如我所说,我是 DAX 的新手,还没有弄明白。
是否有任何方法可以使用类似于 DAX 中 excel 公式的 (min(abs( 部分(因为它具有这些函数)的方法在计算列中进行计算?这可能没有现有的关系还是我每次要更新此报告时都必须在 Excel 中继续做这部分工作?
非常感谢任何帮助。
在 Planned
table 中创建一个计算列,将其命名为 ActualClosestDate
并使用此表达式:
ActualClosestDate =
IF (
DATEDIFF (
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
[Planned],
SECOND
)
< DATEDIFF (
[Planned],
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
),
SECOND
),
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
)
)
其中:
[Planned]
是表 A 中的计划开始 Date/time 列
[Actual]
是表 B 中的实际开始 Date/Time 列
根据您的型号更换。
如果每个 table 中都没有事件列,请在过滤器函数中抑制该条件。
更新:计算三个不同的列可以提高性能,而不是在一个表达式中执行计算。
BeforePlanned =
DATEDIFF (
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
[Planned],
SECOND
)
AfterPlanned =
DATEDIFF (
[Planned],
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
),
SECOND
)
ActualClosestDate =
IF (
[BeforePlanned] < [AfterPlanned],
CALCULATE (
MAX ( TableB[Actual] ),
FILTER ( TableB, [Planned] >= [Actual] && TableA[Event] = TableB[Event] )
),
CALCULATE (
MIN ( TableB[Actual] ),
FILTER ( TableB, [Planned] <= [Actual] && TableA[Event] = TableB[Event] )
)
)
您甚至可以将其拆分为更多列,即一列获取上一个实际日期,一列获取下一个实际日期,那么您只需要:
ActualClosestDate =
IF ( [BeforePlanned] < [AfterPlanned], [PreviousActualDate], [NextActualDate] )
如果有帮助请告诉我。