【うぃんどうかんすう】
ウィンドウ関数 とは?
最終更新:
💡 各行を残したまま、順位や集計結果を添えるSQL関数
SQLの問い合わせ結果の各行を残したまま、同じまとまりの行や指定した範囲を使って計算する関数。順位付け、部署別の合計、累積合計、移動平均などに使う。
📌 このページのポイント
- OVER句で計算のまとまり・順序・フレームを指定する
- PARTITION BYはまとまり、ORDER BYは計算上の順序を決める
- SUMの累積合計やAVGの移動平均は、順序とフレームに応じて変わる
- ROW_NUMBER・RANK・DENSE_RANKは、同じ値の行の扱いが異なる
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のウィンドウ関数を扱うよ