最近お仕事で触れた概念について学んだ内容を整理。
初歩的な内容で恐縮です。
フィルターコンテキストとは?
フィルターコンテキスト(Filter Context)はPowerBIにおいてとても重要な概念。
レポートの対象となる各モデル(≒テーブル)について、DAXやビジュアルの処理対象となるレコードを絞り込む条件を保持しているもの。
この条件にしたがってレコードがフィルターされ、DAXのメジャー計算やビジュアルの表示の対象になるかどうかが決まる。
フィルターコンテキストは外部フィルターと内部フィルターから構成される:
| カテゴリー | 説明 |
|---|---|
| 外部フィルター(External Filter) | DAX式の外部で、PowerBIのUIやレポート構造により生成されるフィルター。スライサー、ページフィルター、ビジュアルレベルフィルターなど、レポートやビジュアルで設定されるフィルター。個別ビジュアルのX軸・Y軸の数値計算でもこのフィルターが発生。 |
| 内部フィルター(Internal Filter) | DAX式の内部で、CALCULATE や FILTER・KEEPFILTERS などにより明示的に指定されるフィルター。あるDAX式で発生したフィルターはそのDAX式(メジャー)を参照する別のDAX式にとってはフィルターコンテキストの一部となる |
メジャーとは?
メジャー(Measure)はこれまたPowerBIにおいてとても重要な概念。
モデルに付属し、DAX式で記述される仮想的な列。当該テーブルに適用されているフィルターコンテキストに基づき、集計処理を行なうもの。内部フィルターの説明にもある通り、メジャー自身がフィルターコンテキストを変更(追加・置換・削除)できる。
ぱっと見似ているものとして計算列があるが、2つの違いを整理すると:
| 名称 | 説明 |
|---|---|
| 計算列(Calculated Column) | モデルの各行に対して計算を行った結果を新しい列として追加する。行単位で処理。DAX式は行コンテキストで処理される。計算は事前に行われその結果はモデルの列として物理的に保存。 |
| メジャー(Measure) | モデルにフィルターを適用した結果に対して集計などを行なう。フィルターコンテキスト単位で処理。DAX式はフィルターコンテキストで処理される。計算は事前には行われず必要に応じて実行される。 |
CALCULATE関数とは?
しばしばフィルターコンテキストとともに紹介されるのが CALCULATE関数。
この関数は フィルターコンテキストを変更できる唯一の 関数。
CALCULATE関数を使うことでフィルターコンテキストへのフィルターの追加・置換・削除ができる。
追加の例。CALCULATEにフィルターを渡すと、フィルターコンテキストに新しいフィルターを追加できる:
CALCULATE(SUM(Sales[Amount]), Sales[Region] = "East")
置換の例。フィルターコンテキスト内にすでに当該の列に対するフィルターが存在した場合、フィルターコンテキストの既存フィルターを新しいフィルターで置換できる。外部フィルターや先行して処理される内部フィルターで当該列にフィルターが指定されていても、それらを上書きしたうえでこのDAX式が評価される:
CALCULATE(SUM(Sales[Amount]), Sales[Region] = "West")
削除の例。ALLやREMOVEFILTERSを使うと、フィルターコンテキストから当該の列に対するフィルターを削除できる。外部フィルターや先行して処理される内部フィルターで当該列にフィルターが指定されていても、それらを削除したうえでこのDAX式が評価される:
CALCULATE(SUM(Sales[Amount]), ALL(Sales))
CALCULATE関数の第2引数以降に記述するフィルター式はある種の糖衣構文。内部的に FILTER関数に展開されて処理される。
あらためて、フィルターコンテキストとは?
- レポートの対象となる各モデルについて、DAXやビジュアルの処理対象となるレコードを絞り込むフィルター条件を保持。
- この条件にしたがってレコードがフィルターされ、DAXのメジャー計算やビジュアルの表示対象を決定。
- 外部フィルターと内部フィルターの重層構造を持ち、メジャーのDAXにより追加・置換・削除が可能。
👉️様々なビジュアルによる可視化とビジュアル間相互作用(Cross Filter・Cross Highlight)によって汎用性の高いレポートを作成できるPowerBIにおいて、レポートを作成するうえで理解することが不可欠の概念!!

