filter only fieldを作る方のfilterパラメータにsql
パラメータが書けるのは知っていたのですが、どういう挙動をするのかを試してみました。
まずは普通に使ってみる
普通というのは、filterパラメータを作成して、派生テーブルのwhere句に{% condition filter_name %} table.field {% endcondition %}
を書く一番シンプルな方法です。
view: dt_filters {
derived_table: {
sql: SELECT
users.state AS users_state,
users.gender AS users_gender,
COUNT(*) AS users_count
FROM looker-private-demo.ecomm.users AS users
WHERE {% condition select_resion %} users.state {% endcondition %}
GROUP BY
1,
2 ;;
}
filter: select_resion {
label: "地域"
type: string
}
:
}
これをExploreでどんなSQLが生成されるかを確認します。
Exploreのフィルターで指定したロジックに合わせてwhere句を生成してくれました。
filterパラメータにsqlを使ってみる
派生テーブルのwhere句に{% condition filter_name %} table.field {% endcondition %}
ロジックを書いて挙動を確認できたので、今度はfilterパラメータにsqlを書いて挙動を確認します。
view: dt_filters {
derived_table: {
sql: SELECT
users.state AS users_state,
users.gender AS users_gender,
COUNT(*) AS users_count
FROM looker-private-demo.ecomm.users AS users
WHERE {% condition select_resion %} users.state {% endcondition %}
GROUP BY
1,
2 ;;
}
filter: select_resion {
label: "地域"
type: string
sql: {% condition select_resion %} ${users_state} {% endcondition %} ;;
}
:
}
Exploreから生成されたSQLを確認します。
(派生テーブル)with区のwhere句に加えて、本体のselect区の方にもwhere句が生成されました。
SQL弱者で申し訳ないのですが、派生テーブルのwhere句だけでなく、外側のwhere句にも必要な場合には使えるの・・・でしょうか?(いるのかな・・・)
派生テーブルじゃないところでfilterパラメータにsqlを書く
派生テーブル内ののfilterパラメータにsqlを書いてしまうと、二重でwhere句が生成されてしまうので、普通のviewでfilterパラメータにsqlを書いてみます。
view: users {
:
dimension: state {
label: "州・都道府県"
sql: ${TABLE}.state ;;
drill_fields: [zip, city]
}
filter: select_resion {
label: "地域"
type: string
suggest_dimension: state
sql: {% condition select_resion %} ${state} {% endcondition %} ;;
}
:
}
ExploreでどのようなSQLが生成されるのかを確認します。
filter only fieldである地域パラメータを選択して、フィルターをかけたい値を入力したらそのロジックでwhere句が生成されました。
これが、sqlがなくなるとどういう挙動をするのかを確認しす。
view: users {
:
dimension: state {
label: "州・都道府県"
sql: ${TABLE}.state ;;
drill_fields: [zip, city]
}
filter: select_resion {
label: "地域"
type: string
suggest_dimension: state
}
:
}
これだとどうなるでしょうか?
where句は生成されませんでした。(ですよね。念のため)
filterパラメータで参照するフィールドをhiddenにしてみる
ドキュメントの最後にfilterパラメータで参照するフィールドはhiddenでユーザーから隠すことができるとのことなので、確認しました。
わかりやすいようにfiltersで参照しているフィールド以外は消してしまって、primary_keyもhiddenにしました。
view: users {
dimension: id {
primary_key: yes
hidden: yes
type: number
sql: ${TABLE}.id ;;
tags: ["user_id"]
}
dimension: state {
label: "州・都道府県"
sql: ${TABLE}.state ;;
hidden: yes
}
filter: select_resion {
label: "地域"
type: string
suggest_dimension: state
sql: {% condition select_resion %} ${state} {% endcondition %} ;;
}
measure: count {
label: "ユーザー数"
type: count
}
}
Exploreで挙動を確認してみます。
ちょっと画像だとわかりづらいのですが、左側のフィールドピッカーにはmeasureのユーザー数とfilter only fieldの地域だけしかありません。
しかしきちんとhiddenされているstateでフィルターがかけられています。
hiddenはユーザーから隠されるだけで、ユーザーからは参照できるので想定通りの挙動ですね。
まとめ
ずっと気になっていてfilterのsqlパラメータについて検証してみました。
SQLのwhere句ににベタ書きでfilterの値を取るだけでいい場合には不要ですが、ユーザーがExploreでfilter only fieldを選択しただけでwhere句を生成させたい場合には使えますね。すっきり