没有关系的 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] )

如果有帮助请告诉我。