2016-11-23 58 views
0

我想从Excel迁移到Power BI的报告,我希望有人可以帮助我,因为我是新来的DAX。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])) 
) 
) 

我也试图找出一个办法做到这一点,如果我建立包含日期范围,我的数据覆盖(约2年)的,但正如我所说的每分钟的日期/时间的表我是DAX的新手,一直没有弄明白。有没有什么办法可以使用类似于(min(abs(DAX中的excel公式的一部分(因为它有这些函数)在计算列中计算它)?是否有可能没有现有的关系或将我还得继续,每次做这部分工作在Excel中我想这份报告更新?

任何帮助极大的赞赏。

回答

0

创建于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]是在表A计划的开始日期/时间列
  • [Actual]是替换根据模型TableB中

实际开始日期/时间列。

如果在每个表格中没有“事件”列,则在过滤器功能中禁用该条件。

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

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

让我知道这是否有帮助。

+0

感谢您的支持。我看到这是如何工作,我有点恼火,我没有想到它,因为它非常简单!不过,我的数据中有15,400行,没有足够的内存来计算它们,这对我来说有点令人惊讶。我会去调查解决方案。也许只是更多的RAM ...... –

+0

@NeilScrivener,一种解决方案可能是创建两个表之间的关系,但我可以看到两个表中没有共同的列。您可以尝试将表达式分成几列。 –

+0

@NeilScrivener,检查我的编辑。它可以帮助你。 –