Databricks Certified Data Engineer Professional 無料問題 4 / 10 ・ 分野3: Data Manipulation
顧客ごとの累計のうち、status = 'PAID' の金額だけを足した列を窓関数で出したい。SUM(amount) FILTER (WHERE status = 'PAID') OVER (PARTITION BY customer_id ORDER BY order_ts) と書いた。公式の構文の説明に合うのはどれか。
- FILTER は窓の中で ORDER BY と一緒に使えないので、ORDER BY を外して書き直す
- そのまま動き、PAID 以外の行は累計に足されず、その行には直前までの累計が入る
- 窓で使う集計関数には FILTER 句を付けられないので、条件を CASE などで関数の中に書く
- そのまま動くが、PAID 以外の行は結果から消え、PAID の行が返される
正解と解説を見る
正解: C
正解の理由
Databricks SQL の窓関数の構文の説明では、窓関数の function に集計関数(aggregate_function)を使うとき、その関数に FILTER 句を含めてはならない、とされている。FILTER (WHERE …) は GROUP BY の集計では使え、条件に合う行だけを集計関数へ渡すが、OVER を付けた窓の集計では使えない。条件付きの累計にしたいなら、たとえば SUM(CASE WHEN status = 'PAID' THEN amount ELSE 0 END) OVER (…) のように、条件を関数の中に書く。
違う選択肢
「そのまま動き、PAID 以外の行は累計に足されず、その行には直前までの累計が入る」… GROUP BY の集計での FILTER の動きを窓へ当てはめたもの。窓で使う集計関数には、FILTER 句そのものを付けられない。
「そのまま動くが、PAID 以外の行は結果から消え、PAID の行が返される」… FILTER は行を結果から消す働きでもない(GROUP BY でも、条件に合わない行を集計関数へ渡さないだけである)。加えて、窓の集計では FILTER を使えない。
「FILTER は窓の中で ORDER BY と一緒に使えないので、ORDER BY を外して書き直す」… ORDER BY の有無で FILTER が使えるようになるわけではない。窓で使う集計関数には、ORDER BY があってもなくても FILTER を付けられない。
押さえどころ
窓の指定では、SORT BY を ORDER BY の別名として、DISTRIBUTE BY を PARTITION BY の別名として書ける。ORDER BY が無いときは、CLUSTER BY も PARTITION BY の別名として使える。
Databricks Certified Data Engineer Professionalの演習アプリ(無料10問・全問は解錠で)へ