Skip to content

SQLウィンドウ関数 解説

よく使われるSQLウィンドウ関数と、それを制御する句を用途別にまとめました:行へのランク付け、隣接行の覗き見、フレーム全体での累計、最初や最後の値の取得。各行で関数と一行の例をペアにします。

ウィンドウ関数は、現在の行に関連する行全体にわたって結果を計算します。GROUP BYのように行を潰し込むことはありません。すべてのウィンドウ関数はOVER句で終わり、この句がウィンドウを定義します:PARTITION BYは行をグループ化し、ORDER BYは順序を定め、省略可能なフレームがスライドする集合の境界を定めます。OVERをマスターすれば、あとは語彙を覚えるだけです。

リファレンステーブル · 27 項目
27 of 27 rows
ランク付け
ウィンドウ内の各行に対する一意の連続整数。ROW_NUMBER() OVER (ORDER BY total DESC)
すき間のあるランク。同順位は同じランクを共有し、次の番号を飛ばします。RANK() OVER (ORDER BY total DESC)
すき間のないランク。同順位は同じランクを共有し、何も飛ばされません。DENSE_RANK() OVER (ORDER BY total DESC)
順序付きウィンドウをほぼ等しいn個のバケットに分割します。NTILE(4) OVER (ORDER BY total DESC)
隣接行を覗く
n行前の値。該当する行がない場合はデフォルト値で置き換えられます。LAG(total, 1, 0) OVER (ORDER BY created_at)
n行先の値。該当する行がない場合はデフォルト値で置き換えられます。LEAD(total, 1, 0) OVER (ORDER BY created_at)
ウィンドウ上の集計
行を潰さない、累計またはパーティションごとの合計。SUM(total) OVER (ORDER BY created_at)
累計またはパーティションごとの平均。AVG(total) OVER (PARTITION BY user_id)
累計またはパーティションごとの行数。COUNT(*) OVER (PARTITION BY user_id)
ウィンドウまたはパーティション全体での最小値。MIN(total) OVER (PARTITION BY user_id)
ウィンドウまたはパーティション全体での最大値。MAX(total) OVER (PARTITION BY user_id)
ORDER BYと先頭から開いたフレームによるSUM。各行は自分までのすべてを合計します。SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
現在の行の前後n行のフレームに対するAVG。AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
最初・最後・パーセンタイル
ウィンドウの順序付けにおける最初の値。FIRST_VALUE(total) OVER (ORDER BY total DESC)
フレーム内の最後の値。UNBOUNDED FOLLOWINGがないと、フレームは現在の行で止まります。LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
ウィンドウの順序付けにおけるn番目の行の値。NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
行の相対ランク。0から1まで。PERCENT_RANK() OVER (ORDER BY total)
現在の行までを含む行の割合。1/nから1まで。CUME_DIST() OVER (ORDER BY total)
OVER句
すべての関数が読むウィンドウを定義します。<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
行のグループごとにウィンドウを再開します。PARTITION BY user_id
各パーティション内の行を順序付けします。ORDER BY created_at
スライドするフレームの境界を定めます。例:前の行から後の行まで。ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
行の位置ではなく値でフレームの境界を定めます。CURRENT ROWは同順位の行を含み、ORDER BYがある場合の既定フレームです。RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
ORDER BYの同順位グループ単位でフレームの境界を定めます。GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
現在の行をフレームから除外します。EXCLUDE TIESは代わりに同順位の行を除外します。ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
クエリごとに一度だけウィンドウに名前を付け、複数のOVER句で再利用できるようにします。WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
ウィンドウが適用される前に、ウィンドウ集計が読む行を絞り込みます。SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)