首页 文章

DAX最接近的值匹配没有关系

提问于
浏览
0

我正在尝试将报告从Excel迁移到Power BI,我希望有人可以帮助我,因为我是DAX的新手 .

我有两个表和一个(我们称之为表A)包含一列计划的开始日期/时间事件,而另一个包含相同事件的实际开始日期/时间 . 计划和实际开始时间之间通常只有几分钟的差异 .

我需要将表B中最接近的实际开始日期/时间与表A中的计划开始日期/时间进行匹配 .

我没有可用于在两个表之间创建关系的现有列 .

如果我能找到最接近的实际开始时间并将其拉入表A,那么我可以从中创建一个关系 .

在Excel中我会用这样的数组公式来做到这一点:(这里我假设一切都在每个表的A列中)

{=Index(TableB!A:A,match(min(abs(TableB!A:A-TableA!A1)),abs(TableB!:A:A-TableA!A1),0),1)}

我在线发现了以下DAX代码,但即使有更接近的值,它也只返回下一个最低值 .

If (
Hasonevalue ( TableA[A] ),
Calculate (
Max ( TableB[A] ),
Filter ( TableB, TableB[A] <= Values ( TableA[A] ) )
)
)

如果我 Build 一个日期/时间表,其中包含我的数据涵盖的日期范围的每一分钟(大约2年),我也试图找到一种方法来做到这一点,但正如我所说,我是DAX的新手,一直无法弄清楚 .

是否有任何方法可以使用类似于(min(abs(DAX中的excel公式的一部分)(因为它具有这些函数)在计算列中计算它?这是否可能没有现有关系或者我必须继续每次我想更新此报告时,在Excel中执行此部分工作?

任何帮助非常感谢 .

1 回答

  • 2

    Planned 表中创建一个计算列,将其命名为 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] 是TableA中的计划开始日期/时间列

    • [Actual] 是TableB中的实际开始日期/时间列

    根据您的型号更换 .

    如果每个表中没有Event列,请在过滤器函数中使用该条件 .

    UPDATE: 计算三个不同的列可以提高性能,而不是在一个表达式中执行计算 .

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

    如果这有帮助,请告诉我 .

相关问题