SQL設計・ウィンドウ関数・関係代数 重要度:★★★出題: AM2・PM1・PM2
ウィンドウ関数(分析関数:OVER / PARTITION BY)
うぃんどうかんすう / SQL Window Functions
GROUP BYのように行を1行に集約して折りたたむことなく、元の行を維持したままパーティション(グループ)内の集計値・順位・移動平均・前後行参照を算出するSQL機能。
3行速習ポイント
- PARTITION BYでグループ化の単位を指定し、ORDER BYでウィンドウ内の並び順を指定する
- ROWS BETWEEN n PRECEDING AND m FOLLOWING により、前後n〜m行の移動平均・累積合計を1回のテーブル走査で計算可能
- ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM(), AVG(), COUNT() などが午後I・午後IIのSQL穴埋めで頻出
図解
図OVER句によるウィンドウ関数の3要素
11. PARTITION BY(分割単位)
Partition行を集約せずにグループ境界(倉庫コード・部品番号等)を定義
22. ORDER BY(順序付け)
Orderingパーティション内の並び順(履歴年月日順等)を定義し順位や累計を計算
33. ROWS BETWEEN(フレーム指定)
Window Framen PRECEDING AND m FOLLOWING で移動平均・直近集計の対象行範囲を指定
概要と本質
近年のデータベーススペシャリスト午後試験において、SQL設計設問の主役となっている機能です。従来は自己結合(Self Join)や相関副問合せを使わなければ書けなかった「直近7日間の移動平均」「グループ内での連番・順位付け」「前回履歴との差分計算」を、簡潔かつ高速(テーブル走査1回)に記述できます。
重要ポイント・コア概念
- RANK()は同順位があるとその次の順位を飛ばす(1, 2, 2, 4)が、DENSE_RANK()は飛ばさない(1, 2, 2, 3)、ROW_NUMBER()は同値でも一意な連番(1, 2, 3, 4)を振る
- フレーム指定:ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING(当該行の前後3行ずつ計7行を対象に移動平均AVG等を算出)
- ORDER BY句のみを指定しフレーム指定を省略した場合、デフォルトは RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(先頭から現在行までの累計)となる
午後I・午後II記述試験での攻略ポイント
午後IのSQL穴埋め問題(例:令和7年午後I問3の前後3日間の在庫移動平均など)では、`AVG(在庫数量) OVER (PARTITION BY 倉庫コード, 部品番号 ORDER BY 履歴年月日 ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)` の各句がそのまま空欄になります。構文と意味を正確に暗記しておきましょう。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える