2016-11-23 18 views
0

ExcelからPower BIへのレポートを移行しようとしています。DAXを初めて使用しているので、誰かが私を助けてくれることを願っています。DAXに最も近い値は、関係なしで一致します

2つのテーブルがあり、1つはテーブルAとしましょう。イベントの開始予定日/時間の列と、同じイベントの実際の開始日時が含まれています。計画された開始時刻と実際の開始時刻との間には通常わずか数分の差があります。

私は2つのテーブル間のリレーションシップを作成するために使用できる既存の列がありません表Aに計画開始日/タイムズに表Bから

を最も近い実際の開始日付/時刻を一致させる必要が

私が最も近い実際の開始時刻を見つけ出し、それをテーブルAにプルすると、そこから関係を作成できます。私はこのような配列数式でこれを行うだろうExcelで

:私はオンライン、次のDAXコードを発見した

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

(ここでは、私はちょうどすべてが、各テーブルの列Aであると仮定している)が、より高い値が近い場合でも次の最小値を返します。私が私が言ったように日付範囲というのが私のデータカバー(約2年)の毎分を含む日付/時刻表を構築する場合、私はまた、これを行う方法を把握することを試みた

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

私は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]

  • [Actual]は交換してください、あなたのモデルに応じてTableBの

での実績開始日付/時刻列でテーブルAでの計画開始日付/時刻列です:

各テーブルに[イベント]列がない場合は、フィルタ機能でその条件を押さえます。

UPDATE: 3つの異なる列を計算すると、1つの式で計算を実行する代わりに、パフォーマンスが向上する可能性があります。

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、1つの解決策は両方のテーブルの間に関係を作成することができますが、私は両方のテーブルに共通の列がないことがわかります。いくつかの列で式を分割することができます。 –

+0

@ NeeScrivener、私の編集を確認してください。それはあなたを助けるかもしれない。 –

関連する問題