Closed2
ウィンドウ関数の基本
※MySQLは8.0以降
ウィンドウ関数とは
- 特定の範囲のデータを参照するような機能
-
group by
などの集約関数を使うと条件に当てはまったすべてが集約されてしまうが、ウィンドウ関数を使用することで、もとの行はそのままに新たに集約された結果の列を追加する事ができる(AGVとかSUMとか) - また、自分から見た相手の場所、相対的に見た自分を確認できたりする(RANKとかPRESEDINGとか)
- それぞれの例を見たほうが早いかもなので例を書いていく
簡単な例(集約関数)
前述の 「group by
などの集約関数を使うと条件に当てはまったすべてが集約されてしまうが〜」の部分。
下記のような sales
テーブルを用意する
id | group_id | cost |
---|---|---|
1 | 1 | 100 |
2 | 1 | 100 |
3 | 1 | 200 |
4 | 2 | 30000 |
5 | 2 | 40000 |
6 | 2 | 100000 |
group_id
単位で集約した cost
を見たい場合、このようなクエリを実行する
SELECT
group_id, SUM(cost) total_cost
FROM sales
GROUP BY group_id;
結果はidなどは無視され、group_id
単位で集約された値のみが表示される
group_id | total_cost |
---|---|
1 | 400 |
2 | 170000 |
ここでウィンドウ関数を使用することで、もとのデータを残したまま新たに計算結果の列を追加することができる
以下のようなクエリを実行する
SELECT id, group_id, cost, SUM(cost) OVER (PARTITION BY group_id) total_cost
FROM sales;
id | group_id | cost | total_cost |
---|---|---|---|
1 | 1 | 100 | 400 |
2 | 1 | 100 | 400 |
3 | 1 | 200 | 400 |
4 | 2 | 30000 | 170000 |
5 | 2 | 40000 | 170000 |
6 | 2 | 100000 | 170000 |
実用例としては、グループ内の total_cost
に対する貢献度が3割に満たない行を出す、のような要件の場合、ウィンドウ関数を使うことで1発で完結に記載することができる。
SELECT id, group_id, cost, total_cost
FROM (
SELECT id, cost, group_id, SUM(cost) OVER (PARTITION BY group_id) total_cost
FROM sales
) tmp
WHERE cost < total_cost * 0.3;
id | group_id | cost | total_cost |
---|---|---|---|
1 | 1 | 100 | 400 |
2 | 1 | 100 | 400 |
4 | 2 | 30000 | 170000 |
5 | 2 | 40000 | 170000 |
「また、自分から見た相手の場所、相対的に見た自分を確認できたりする(RANKとかPRESEDINGとか)」については後日記載
このスクラップは2022/11/09にクローズされました