ウィンドウ関数
PostgreSQL のウィンドウ関数とは?
ウィンドウ関数は、順位や累計など、関連する行の集合にわたって値を計算します。GROUP BY のようにそれらの行を 1 行にまとめることはありません。
ウィンドウ関数は、OVER 句で定義される、現在の行に関連する行の集合にわたって計算を行います。GROUP BY を使った集約とは異なり、すべての入力行が出力に残り、それぞれに結果が付きます。
PARTITION BY は行をグループに分け、ORDER BY は各グループ内の順序を決めます。組み込みのウィンドウ関数には row_number、rank、dense_rank、lag、lead、first_value などがあり、sum や avg などの通常の集約関数も OVER と組み合わせて使えます。ウィンドウ関数を使えるのは、クエリの SELECT リストと ORDER BY 句の中だけです。
例
この例では、チーム内でプレイヤーに順位を付け、各行の横にチームの合計得点を表示します。
CREATE TABLE scores (player text, team text, points int);
INSERT INTO scores VALUES
('ana', 'red', 30), ('ben', 'red', 25), ('cy', 'blue', 40), ('dee', 'blue', 35);
SELECT player, team, points,
rank() OVER (PARTITION BY team ORDER BY points DESC) AS team_rank,
sum(points) OVER (PARTITION BY team) AS team_total
FROM scores
ORDER BY team, team_rank;拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。