ウィンドウ関数
ウィンドウ関数は、ランキング、連番生成等の集約関数で通常できないような操作をする際に用いる。別名としてOLAP関数(OnLine Analytical Processing)とも呼ばれ、データベースをリアルタイムに処理して、オンラインでデータ分析などを行う際に使用する。よって、ウィンドウ関数は、OLAP用途のために、SQLに追加された機能。
具体的にどんなものかというと次のようなもの。
ウィンドウにすることの旨味としては、区切られたウィンドウ内でデータを操作できる点。ウィンドウ関数の構文は次のようになっている。
ウィンドウ関数 OVER ([PARTITION BY 列リスト]) ORDER BY ソート用列リスト) -- []内は省略可
構文内に登場するウインドウ関数として使えるものをまとめる。
- 集約関数:
SUM
,AVG
,COUNT
,MAX
,MIN
- ウィンドウ専用関数:
RANK
,DENSE_RANK
,ROW_NUMBER
例のごとく次のテーブルに対して、使ってみてどんな感じかを確認する。
RANK関数:レコードのランキングを算出
RANK
関数はレコードの順位を算出する。
結果をみても分かる通り、ウィンドウ関数はGROUP BY
のカット機能とORDER BY
の順序付を合わせたような機能となっている。ただし、PARTION BY
は集約機能は持たない。
また、PARTION BY
は省略可能で、省略するとテーブル全体のランキングが算出される。
DENSE_RANK関数、ROW_RANK関数:色々な順位付
DENSE_RANK
もROW_RANK
も名前の通り順位付のウィンドウ専用関数。RANK
との違いをまとめると次の通り。
関数名 | 順位付ルール |
---|---|
RANK |
同順位がいる場合に、後ろの順位を飛ばす (1位、1位、3位) |
DENSE_RANK |
同順位がいる場合に、後ろの順位を飛ばさない (1位、1位、2位) |
ROW_RANK |
一意の連番にする (1位が3レコードある:1位、2位、3位) |
集約関数をウィンドウ関数として用いる
集約関数をウィンドウ関数として用いる場合、ウィンドウ内の結果が集約される。例を示す。
SUM
の場合AVG
の場合PRECEDING
とFOLLOWING
でウィンドウフレームを動かす範囲を指定して、当該部分だけに対して集約関数を実行することもできる
GROUPING演算子
GROUP BY
句と集約関数だけでは、小計と合計を同時に求めることができなかったが、GROUPING
演算子を用いれば一気に計算できる。GROUPING
演算子は下記の3種類がある。
ROLLUP
CUBE
GROUPING SETS
ROLLUP
:合計と小計を一度に求める
GROUPING
:データとしてのNULLを見分ける
操作した結果得られるテーブルは、実際のテーブルのデータが本当にNULL
の場合、とGROUP BY
によって集約キーがないためNULL
となっている場合の区別がつけることが難しい。そんな時に使うのが、GROUPING
。
これも具体例を見た方がわかりやすい。
CUBE
:データで積み木を作る
CUBE
は『全ての可能な組み合わせ』を1つの結果にまとめるようなもの。
イメージ的には、次のようなもの。
コマンドを実行して得られる結果は次のとおり。
GROUPING SETS
:欲しい積み木だけ取得
GROUPING SETS
は、GROUPING
やCUBE
で求めた結果の一部を取得する演算子。