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,檢查我的編輯。它可以幫助你。 –