Closed2

ウィンドウ関数の基本

hatsu0412hatsu0412

※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
hatsu0412hatsu0412

「また、自分から見た相手の場所、相対的に見た自分を確認できたりする(RANKとかPRESEDINGとか)」については後日記載

このスクラップは2022/11/09にクローズされました