このカテゴリーでは競馬予想プログラミング以外でも役に立つ、PostgreSQLの汎用的な技術について解説します。
構文
重複する「順位」が欲しいなら rank、連続する「順位」が欲しいなら dense_rank
rank() OVER (PARTITION BY 列名1 [, 列名2] ORDER BY 列名1 [, 列名2])
dense_rank() OVER (PARTITION BY 列名1 [, 列名2] ORDER BY 列名1 [, 列名2])
一意の「行番号」が欲しいなら row_number
row_number() OVER (PARTITION BY 列名1 [, 列名2] ORDER BY 列名1 [, 列名2])
構文の違いは先頭の「rank」と「row_number」だけ。PARTITION BY句でグループを指定します。ORDER BY句に指定した列の並び順に対して、順位または行番号を返します。
検索結果の全体に対して順位を求める場合は、次のように ORDER BY句のみでOK。
rank() OVER (ORDER BY 列名1 [, 列名2])
具体的な使い方
ウィンドウ関数は基本的にSELECT句で使います。例えば、出走馬の「後半3F」の順位を各レースごとに求めたい場合は、次のようなSQLを書きます。
SELECT
kaisai_nen
, kaisai_tsukihi
, keibajo_code
, race_bango
, umaban
, kohan_3f
, rank() OVER (
PARTITION BY
kaisai_nen
, kaisai_tsukihi
, keibajo_code
, race_bango
ORDER BY
kohan_3f ASC
) AS kohan_3f_rank
FROM
jvd_se
rank は同点の場合に同じ値を返します。
dense_rank は連続する順位を返します。
row_number は同点の場合でも上から順に一意の行番号を返します。
コメント