プログラミング

SQLにおけるウィンドウ関数

SQLにおいてウィンドウ関数を使うことで、テーブルに対して集計値を追加することができます。
似たような(でも結果が違う)GROUP BY句と必要に応じて使い分けることで、様々な計算処理を行えます。
このページでは、SQLにおけるウィンドウ関数の処理例とウィンドウ関数の一覧を取り上げています。

ウィンドウ関数とは

SQLにおけるウィンドウ関数とは、特定の範囲のデータに対して計算処理(例:平均値の計算)を行う関数です。
たとえば、次のような市区町村ごとの人口表がある際に、市区町村ごとの人口を都道府県単位に集約する操作(=合計値の算出)を行う例があります。
「都道府県」という範囲に対して特定の計算処理(合計値の算出)を行う際に、SQLではSUM関数という合計を算出するウィンドウ関数を利用して計算します。

表 市区町村別人口一覧表
出典:Category:都道府県の自治体人口テンプレート ウィキペディア 2025/6/29閲覧

都道府県市区町村市区町村人口
北海道札幌市1,956,097
北海道函館市234,579
・・・・・・・・・
沖縄県伊是名村1,184
沖縄県多良間村1,006

ウィンドウ関数は、OVER句とPARTITION BY句を一緒に使用します。
以下のコードでは、SUM関数を使って都道府県ごとの人口の合計を計算しています。
計算した都道府県人口は、元のテーブルに新しい列として追加されています。

SQL
-- PARTITION BYを使って市区町村別人口表に都道府県全体人口をカラムとして追加
SELECT 都道府県, 市区町村, 市区町村人口
  SUM(人口) OVER (PARTITION BY 都道府県) AS 都道府県人口
FROM 市区町村別人口一覧表

表 市区町村別人口一覧表
出典:Category:都道府県の自治体人口テンプレート ウィキペディア 2025/6/29閲覧

都道府県市区町村市区町村人口都道府県人口
北海道札幌市1,956,0975,016,280
北海道函館市234,5795,016,280
・・・・・・・・・・・・
沖縄県伊是名村1,1841,465,079
沖縄県多良間村1,0061,465,079

参考までに、似たような集計としてGROUP BY句を使う処理があります。
GROUP BY句を使った次の処理では、元の表とは別に都道府県人口の表を作成しています。

SQL
-- GROUP BYを使う場合は市区町村別人口表を集約して都道府県別人口表を作成
SELECT 都道府県, AVG(市区町村人口) AS 都道府県人口
FROM 市区町村別人口一覧表
GROUP BY 都道府県

表 都道府県別人口一覧表
出典:Category:都道府県の自治体人口テンプレート ウィキペディア 2025/6/29閲覧

都道府県都道府県人口
北海道5,016,280
青森県1,150,931
・・・・・・
沖縄県1,465,079

ウィンドウ関数の一覧

先述のSUM関数の場合と同様に、OVER句、PARTITION BY句と組み合わせてウィンドウ関数を使うと、様々な処理を実装できます。
LAGやLEADを使うと前後〇行の値を取得できますし、RANKやDENSE_RANKを使い分けることでグループ内での順位を返すこともできます。
RANKは同率の順位があるとその後の順位は飛ばす(1位が2人いると2位が存在せず次は3位)のに対し、DENSE_RANKは飛ばさしません(1位が2人いても次の順位は3位)。

最後にウィンドウ関数の一覧を記載しています。

表 ウィンドウ関数の一覧
出典:三好 康之「情報処理教科書 データベーススペシャリスト」翔泳社(2025)

関数処理内容
AVG(列名)平均値を返す
MAX(列名)最大値を返す
MIN(列名)最小値を返す
SUM(列名)合計値を返す
COUNT(列名)行数を返す
ROW_NUMBER()行番号を返す(1から順に番号割り振り)
LAG(列名, n)n行の値を返す(n省略時 n=1)
LEAD(列名, n)n行の値を返す(n省略時 n=1)
RANK()順位を返す(同率はその後の順位を飛ばす
DENSE_RANK()順位を返す(同率でもその後の順位は飛ばさない
PERCENT_RANK()相対順位を返す(0≦x≦1 のパーセントランク値)
CUME_DIST()相対順位を返す(0<x≦1 累積分布)
NTILE(n)n個の階級に均等に分割し、階級の番号を返す

参考文献

三好 康之「情報処理教科書 データベーススペシャリスト」翔泳社(2025)
3.5. ウィンドウ関数 PostgreSQL 8.4.4文書 第 3章高度な諸機能 2025/6/27閲覧
Template:自治体人口/北海道 ウィキペディア 2025/6/29閲覧
Template:自治体人口/沖縄県 ウィキペディア 2025/6/29閲覧
RANK (Transact-SQL) - SQL Server Microsoft 2025/6/3閲覧
PERCENT_RANK (Transact-SQL) Microsoft 2025/6/3閲覧

-プログラミング
-, ,