【うぃんどうかんすう】

ウィンドウ関数 とは?

最終更新:
💡 各行を残したまま、順位や集計結果を添えるSQL関数

SQLの問い合わせ結果の各行を残したまま、同じまとまりの行や指定した範囲を使って計算する関数。順位付け、部署別の合計、累積合計、移動平均などに使う。

📌 このページのポイント
ウィンドウ関数:各行を残して計算する 計算前 累計を添えた結果 部署 月 売上 A 1 100 A 2 150 A 3 200 B 1 80 B 2 120 B 3 90 部署 月 売上 累計 A 1 100 100 A 2 150 250 A 3 200 450 B 1 80 80 B 2 120 200 B 3 90 290 部署ごとに、月の順で先頭から現在行まで SUM(sales) OVER (PARTITION BY dept ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 例:各部署は月ごとに1行。表示順は別に指定。
部署別の累積合計の例。青はA部署、緑はB部署の計算範囲を表す。
ひよこ ひよこ
GROUP BYとどう違うの?
ペンギン先生 ペンギン先生
GROUP BYで集約すると、同じグループの明細は集約結果の行にまとまるよ。ウィンドウ関数は問い合わせの各行を残して、部署の合計などを添えられる。ただしWHEREなどで取り除かれた行は計算対象にならず、集約した結果にウィンドウ関数を使うこともあるんだ
ひよこ ひよこ
OVERの中には何を書くの?
ペンギン先生 ペンギン先生
PARTITION BYは部署などのまとまり、ORDER BYはその中で計算する順序、ROWSなどは計算対象のフレームを指定するよ。例えばSUM(sales) OVER (PARTITION BY dept)は部署合計。OVER内のORDER BYだけでは、最終結果の表示順は決まらないんだ
ひよこ ひよこ
SUM() OVER()なら累積合計になる?
ペンギン先生 ペンギン先生
順序やフレームが大切だよ。図の各部署は月ごとに1行で、SUM(sales) OVER (PARTITION BY dept ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)なら、部署内の先頭から現在行までの累計になる。順序指定のないSUM(sales) OVER ()は対象全体の合計なんだ
ひよこ ひよこ
順位の3種類は何が違うの?
ペンギン先生 ペンギン先生
値が同じ2行を先頭に並べると、ROW_NUMBERは1・2・3、RANKは1・1・3、DENSE_RANKは1・1・2となるよ。ROW_NUMBERで同値の行の順番まで一定にしたい場合は、ORDER BYに一意なIDなども加えるんだ
ひよこ ひよこ
移動平均の範囲はどう決めるの?
ペンギン先生 ペンギン先生
AVGにROWS BETWEEN 2 PRECEDING AND CURRENT ROWを指定すれば、現在行と前の最大2行の平均になるよ。3日分という意味とは限らない。RANGEではORDER BYの値や同値の行を基準にするので、ROWSと結果が違う場合があるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ウィンドウ関数」って出てきたら「各行を残しながら、順位や集計結果を添えるSQL関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Window Function」 = 窓関数
💬 Windowは窓、Functionは関数だよ。各行を計算するときに使う行の範囲を、窓のように考える名前なんだ。ここではSQLのウィンドウ関数を扱うよ

参考資料

← 用語集にもどる