Window関数とは
ただの集約関数じゃないの?いいえ違います。
Googleの公式リファレンスには以下のように記載されています(2019年6月14日時点)。
データベースでは、分析関数は行のグループ全体に対して集計値を計算する関数です。行のグループに対して単一の集計値を返す集計関数とは異なり、分析関数は入力行のグループに対して分析関数を計算することで、行ごとに単一の値を返します。
一体どういうことかなかなかピンと来ないと思いますので具体的に説明していきます。
サンプルテーブル
例えば肉・野菜・魚の好き嫌いのアンケートをネットで調査したとする
sample_table
id | user_id | category | like_or_not | created_at |
---|---|---|---|---|
1 | A | fish | like | 2019-01-01 0:00:00 |
2 | B | fish | not | 2019-01-02 0:00:00 |
3 | C | meat | like | 2019-01-03 0:00:00 |
4 | B | meat | like | 2019-01-03 0:00:00 |
5 | C | fish | not | 2019-01-04 0:00:00 |
6 | B | vegetable | not | 2019-01-03 0:00:00 |
7 | C | vegetable | not | 2019-01-05 0:00:00 |
サンプルコード
普通の集約関数
ユーザーごとの初回回答日時を求める
SELECT
sample_table.user_id,
MIN(sample_table.created_at) AS first_created_at
FROM
sample_table
GROUP BY sample_table.user_id
実行結果
sample_table.user_id | first_created_at |
---|---|
A | 2019-01-01 0:00:00 |
B | 2019-01-02 0:00:00 |
C | 2019-01-03 0:00:00 |
WINDOW関数を使う場合
sample_tableに1列追加してユーザーの最初の回答日時を付け加える
PARTITION BY
これがGROUP BY みたいなものです
GROUP BYしなくてもユーザーの最初の回答日時を算出できます
SELECT
sample_table.*,
MIN(sample_table.created_at)OVER(PARTITION BY sample_table.user_id) AS first_created_at
FROM
sample_table
実行結果
id | user_id | category | like_or_not | created_at | first_created_at |
---|---|---|---|---|---|
1 | A | fish | like | 2019-01-01 00:00:00 UTC | 2019-01-01 00:00:00 UTC |
2 | B | fish | not | 2019-01-02 00:00:00 UTC | 2019-01-02 00:00:00 UTC |
4 | B | meat | like | 2019-01-03 00:00:00 UTC | 2019-01-02 00:00:00 UTC |
6 | B | vegetable | not | 2019-01-03 00:00:00 UTC | 2019-01-02 00:00:00 UTC |
5 | C | fish | not | 2019-01-04 00:00:00 UTC | 2019-01-03 00:00:00 UTC |
3 | C | meat | like | 2019-01-03 00:00:00 UTC | 2019-01-03 00:00:00 UTC |
7 | C | vegetable | not | 2019-01-05 00:00:00 UTC | 2019-01-03 00:00:00 UTC |
このテーブルがあれば初回の回答日時からどれくらい経過して回答しているかなど算出可能範囲が広がりますよね。