【PostgreSQL】なんとなくわかるWindow関数とは
なんとなくわかるWindow関数とは
この記事ではWINDOW関数を、サンプルデータを使って
なんとなーくイメージをつかんでもらおうとする記事です。
(なんとなくなので構文の説明はほかのサイトに任せることとします。)
そもそもWindow関数とは
Window関数とはデータをWindowという領域で区切り、
その中で合計値を取得したり、ランク付けしたりできるようになります。
GROUP BYは行が集約されて結果が取得できますが、WINDOW関数では、
行がまとめられることはなく、それぞれが取得できるのが大きく違います。
サンプルデータで実行してみる
生徒とそのテスト結果というデータを用意してみました。
student_name(生徒名)、subject_name(教科)、score(点数)とします。
WINDOWS関数の例①
教科でWINDOWを区切った後、合計値、ランク付けをするSQLの例です。
※「PARTITION BY subject_name」で「教科ごとに区切る」を表しています
SELECT
--教科
subject_name,
--教科でWindowを区切る(PARTITION BY subject_name)
--教科ごとに、点数の高い順(order by score desc)に生徒を表示する
rank() OVER(PARTITION BY subject_name order by score desc) AS ranking
--生徒, 点数
, student_name , score
--教科ごとに合計点を取得する
, sum(score) OVER (PARTITION BY subject_name)
FROM test_score;
結果はこんな感じ。教科ごとに点数の高い順にデータが並ぶ形になります。
英語の点数が高い生徒、国語の点数が高い生徒、…という形。
(赤い線はわかりやすいように後から引いています)
WINDOWS関数の例②
上のSQLは
『PARTITION BY subject_name(教科に対しての順位付け)』でしたが、
『PARTITION BY student_name(生徒に対しての順位付け)』に変更してみます。
SELECT
--生徒名
student_name,
--生徒でWindowで区切る(PARTITION BY student_name)
--生徒ごとに、点数の高い順(order by score desc)に教科を表示する
rank() OVER(PARTITION BY student_name order by score desc) AS ranking
--教科, 点数
, subject_name , score
--またその生徒ごとに合計点を取得する
, sum(score) OVER (PARTITION BY student_name)
FROM test_score;
すると結果はこんな感じ。
生徒ごとに教科の点数が高い順に並べた結果になります。
なんとなくまとめ
サンプルを2つ提示しましたが、ざっくりとイメージはつかめたでしょうか。
まとめるとWINDOW関数とは…
・WINDOWという区切りを作り、その中で集計やランク付けができる
・GROUP BYは結果が集計されるが、WINDOW関数は集計されない
というものでした。