LookMLで実装する「動的フィルタリング」完全ガイド
はじめに
どうも、ざきです!今日はLookerであまり解説されていない 「動的フィルタリング」 の実装方法について解説します。
Lookerにおける「動的フィルタリング」は、単なるUIの便利機能ではなく、 「SQL生成プロセスのどこを動かすか」 という設計問題です。ここを誤ると、以下のような典型的なBI負債に繋がります。
この記事では「動的にできるかどうか」ではなく、 「どのレイヤーを動かすのが設計として妥当か」 という観点で、Lookerの動的フィルタリングを整理します。
記事の対象者
Lookerにおける「動的フィルタリング」とは何か
1.1 よくある誤解
- フィルタはUI側だけで完結するもの
- ダッシュボードフィルタ = 単なるSQLの
WHERE句 - Lookerなら何でも簡単に動的に切り替えられる
これらは 半分正しくて、半分間違い です。
なぜならLookerの本体はUIではなく、**「LookML → SQLへのコンパイル」**だからです。UI操作はあくまでトリガーであり、実際に変わるのは「生成されるSQL」そのものです。
1.2 Looker の設計思想
Lookerは モデル駆動(LookML) です。
ユーザーがダッシュボードで操作を行ってからデータが表示されるまで、以下のプロセスを辿ります。
つまり「動的」とは、このプロセスの 2番と3番(SQLを生成する前)に介入して、SQLの構造を書き換えること を指します。UI操作はあくまでトリガーであり、本体はLookMLによるSQLの制御なのです。
動的フィルタリングの分類
実装方法を5段階で分類しました。番号が若いほど安全で標準的、下に行くほど柔軟な反面、取り扱い(メンテナンス)が難しくなります。
| パターン | 主な用途 | 主役となる機能 | 柔軟性 |
|---|---|---|---|
| 1.静的フィルタ | 単純な条件指定 | filter |
低 |
| 2.UI連動 | ユーザーによる絞り込み | dashboard filter |
低 |
| 3.条件分岐 (quoted) | 値に基づくロジック切替 | parameter |
中 |
| 4.条件分岐 (unquoted) | SQL構文レベルの制御 | parameter (unquoted) |
高 |
| 5.SQL直接制御 | 複雑な列・条件の切替 | Liquid |
高 |
「動的フィルタを実装したいが、どの方法がベストか?」と迷ったときは、以下のフローに沿って判断してください。
これだけだとイメージがしづらい部分もあるので、各段階ごとにそれぞれ解説をしていきます。
1.静的フィルタ(filter)
目的と解決できること
日付やステータスなど、特定の項目に対してユーザーが任意の値でデータを絞り込めるようにしたい場合に使用します。LookMLにおいて最も標準的なフィルタリングの実装です。
主な利用シーン
- 注文日を指定して、特定の期間のデータに絞り込みたい
- 注文ステータスを completed(完了済み)のみに限定して分析したい
# ユーザーが値を入力するためのフィルタを定義
filter: order_date {
label: "注文日指定"
type: date
}
# フィルタで受け取った条件をWHERE句に反映させる記述
dimension: is_in_period {
type: yesno
sql: {% condition order_date %} ${TABLE}.order_date {% endcondition %} ;;
}
動作の仕組み
ユーザーがダッシュボードやExploreで日付を選択すると、Lookerがその値を解釈し、SQL生成時に WHERE order_date BETWEEN ... といった条件句を自動的に構成します。
導入の判断基準
2.UI連動(dashboard filter)
目的と解決できること
LookMLを編集することなく、ダッシュボード上の操作だけで表示データを一括制御したい場合に使用します。複数のチャート(タイル)に対して、共通の切り口でフィルターをかけられるLookerの最も一般的なインターフェースです。
主な利用シーン
- 「事業部セレクター」を設置し、ダッシュボード全体の数字を一括で切り替えたい
- 「地域」や「カテゴリ」を選択して、関連するすべてのグラフを連動させたい
動作の仕組み
ユーザーがUI上で値を操作すると、Lookerが自動的に各タイルのクエリへ WHERE 句を追加します。LookML側に特別なロジックを書き込む必要がなく、GUI上で設定が完結するのが特徴です。
導入の判断基準
3.条件分岐(parameter/quoted)
目的と解決できること
ユーザーが選択した項目に応じて、計算ロジック(CASE文など)を動的に切り替えたい場合に使用します。1つのグラフで複数の指標を切り替えて表示できるため、ダッシュボードの枚数を削減するのに非常に有効です。
主な利用シーン
- 1つのグラフで「売上額」と「注文数」を切り替えて表示したい
- 集計単位を「合計(SUM)」と「平均(AVG)」でユーザーに選ばせたい
parameter: metric_type {
label: "表示指標を選択"
type: string
allowed_value: { label: "売上額" value: "sales" }
allowed_value: { label: "注文数" value: "count" }
}
measure: dynamic_metric {
label_from_parameter: metric_type
type: number
sql:
CASE
WHEN {% parameter metric_type %} = 'sales' THEN ${sales_amount}
WHEN {% parameter metric_type %} = 'count' THEN ${order_count}
ELSE NULL
END ;;
}
動作の仕組み
ユーザーが選択した値が「文字列(quoted)」としてSQL内に埋め込まれます。LookerはそれをもとにSQLの CASE WHEN 文を実行し、条件に合致する方のロジックを採用します。
導入の判断基準
4.条件分岐(parameter/unquoted)
目的と解決できること
SQLの構文そのもの(参照する列名やテーブル名など)を直接書き換えたい場合に使用します。quotedとの最大の違いは、値としてではなく、SQLのパーツとして展開される点にあります。
主な利用シーン
- 参照するカラム自体(sales_amount か profit_amount か)を動的に差し替えたい
- 大規模データにおいて、CASE文を通すことによるパフォーマンス低下を避けたい
parameter: column_selector {
label: "集計対象の列を選択"
type: unquoted
allowed_value: { label: "売上金額" value: "sales_amount" }
allowed_value: { label: "利益金額" value: "profit_amount" }
}
dimension: dynamic_column {
label_from_parameter: column_selector
type: number
# 選択された値がそのまま「列名」として展開される
sql: ${TABLE}.{% parameter column_selector %} ;;
}
動作の仕組み
UIでの選択内容が「引用符なし(unquoted)」でSQLに直接パッチされます。
- UIで「売上金額」を選択した場合、Looker内部で以下のようにSQLが組み立てられます。
# 生成されるSQLイメージ
SELECT
orders.sales_amount AS dynamic_column -- そのまま列名として注入される
FROM orders
- UIで「利益金額」を選択した場合、パラメータのvalueに指定した文字列が、そのままSQLのパーツになります。
# 生成されるSQLイメージ
SELECT
orders.profit_amount AS dynamic_column -- 構文そのものが書き換わる
FROM orders
導入の判断基準
5.SQL制御(Liquid)
目的と解決できること
特定の条件(ユーザー属性や選択内容)によって、SQLの記述そのものを大幅に改変したい場合に使用します。Lookerにおける動的制御の「最終手段」です。
主な利用シーン
- 特定のフィルタが選ばれている時だけ、別のテーブルをJOINさせたい
- ログインユーザーの権限に応じて、参照するスキーマを動的に変えたい
dimension: dynamic_value {
sql:
# view_name は実際のView名に置き換える
{% if view_name.metric_type._parameter_value == "sales" %}
${TABLE}.sales
{% else %}
${TABLE}.order_count
{% endif %} ;;
}
動作の仕組み
LookerがSQLをデータベースに投げる前の段階で、LiquidエンジンがSQLのテキスト自体を書き換えます。
導入の判断基準
最後に
今回はLookerの動的フィルタリングを分類して解説しました。
設計の段階で意識すべきは、 「可能な限りシンプルな方法(番号の若い順)を採用すること」 です。
それぞれのトレードオフを認識し、ユースケースに合わせて適切な実装を選択することで、LookMLのViewの肥大化やモデルの増殖を劇的に抑えることができます。
ぜひ、明日のLookML開発から意識してみてください!
Discussion