FILTER関数を使用する場合と使用しない場合のCALCULATE
関数の結果の違いは何ですか。これらの2つのメジャーがあるとします。
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color]="Red")
更新。追加のバウンティ質問:ALL
やALLSELECTED
などの他の関数を使用して、Measure2を変更して、Measure1とまったく同じ結果を返す方法はありますか?
バウンティ後の更新
受け入れた回答とは異なる回答に対する報奨金を付与することにしました。
結果だけでなく、両方のメジャーの結果を取得する方法も同じではありません。
これをテストするために、例に似た2つのメジャーを作成しました。
TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))
追加のフィールドやスライサーを使用せずに単純に両方をピボットテーブルにスローすると、もちろん両方とも同じ結果が表示されます。
しかしながら:
FILTER
を使用すると、パフォーマンスに大きな影響があります。これは、クエリプランとストレージエンジンとフォーミュラエンジンの使用率を見ると明らかです。レポート/ピボットテーブル自体(行、列、スライサー)からの既存のフィルターと「対話」する必要がある追加の一時テーブルを作成します。単一セルの単純な平均値については何もわかりませんが、[x]メジャー自体が複雑で、これらの「初期」フィルターが多数ある場合、計算時間の差は非常に大きくなる可能性があります。
FILTER
は保持され、初期のフィルターコンテキストと対話しますが、CALCULATE
で直接使用されるフィルター式はそれを無視します。 ReadDateをピボットテーブルに追加すると、どうなるかを確認します。
これがまさに、FILTER
のないメジャーの方が高速である理由です。列内の日付は気にしません-すでに1つの「真の」値を計算しますが、FILTER
のメジャーはすべての行の初期フィルターに対して評価します。
両方の列の結果は正しいと見なすことができます。実際はすべて、解釈とメジャーの命名方法に依存します;)。
一般的なルールとして、必要のないときにFILTER
を使用しないことをお勧めします。本当に必要なときに電力を節約してください。
ここでの違いは、CALCULATE
が既存のフィルターコンテキストを置き換える単純なフィルターを許可することです。あなたの例では、CALCULATE
は既存のフィルターコンテキストを使用してメジャー[X]
を計算しますが、FactTable[Color]
の既存のフィルターコンテキストを削除し、FactTable[Color] = Red.
に置き換えます。
FILTER
関数は反復子です。つまり、テーブル(最初の引数として渡される)を一度に1行ずつステップ実行し、各行の式(2番目の引数)を評価します。 FILTER
内にCALCULATE
関数がある場合、既存のフィルターコンテキストをFILTER
の結果と結合します(単純なフィルター引数のように置き換えるのではなく)。
一般に、計算がより効率的になるので、選択がある場合は常に単純なフィルターを使用します。ただし、FILTER
関数を使用すると、より複雑なフィルタリングを実行できるため、単純なフィルターでは不十分な場合でも非常に便利です。
さらに読む: FILTER()–いつ、なぜ、どのように使用するか
論理式の代わりにDAXによって生成される自動FILTER関数のDAX構文では、フィルター式で単一の列を表現する必要があります。この例を見てみましょう-
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
上記の構文は内部的に次の構文に変換されます。これは、DAXメジャーから同じ動作を取得する明示的な方法で記述することができます。
Measure1 = CALCULATE([X], FILTER(ALL('FactTable'[Color]), 'FactTable'[Color]="Red"))
したがって、Measure2値で最後の関数を使用すると、同じ結果が取得されます。
作成したメジャーの出力は、「Red」の色としてフィルターに1つの値のみを渡すため、同じ出力になります。
ただし、値の範囲(日付範囲など)をフィルターに渡す場合、Measure1は機能しません。単一の値のみをフィルターに渡します。
Measure2では、特定のテーブルと列からFILTER関数を使用して特定の値の範囲を渡し、目的の出力を取得できます。
Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color])
FILTERを使用して、作業中のテーブルの行数を減らし、計算で特定のデータのみを使用できます。
FILTER関数の詳細については、機能の例をこちらでご覧ください-
https://msdn.Microsoft.com/en-us/query-bi/dax/filter-function-dax