ウィンドウ関数で順位または行番号を求める

PostgreSQL

このカテゴリーでは競馬予想プログラミング以外でも役に立つ、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 は同点の場合でも上から順に一意の行番号を返します。

コメント