本記事では、
Oracleでランク順をもとめることができるRANK関数の使い方ついて解説していく。
RANK –ランクを計算する–
Oracleの「RANK」関数を使えば、
指定列のランク順をもとめることが可能だ。
RANKの使い方
RANKの使い方は大きく分けると、
以下の2パターンが存在する。
- 単純にランク順を取得するパターン
- グループ毎にランク順を取得するパターン
それぞれについて順番に使い方を解説していく。
①単純にランク順を取得するパターン
まずは、
単純にランク順を取得するパターン。RANKの基本となる使い方だ。
--列1のランクを取得する
RANK() OVER (ORDER BY 列名)
ランクを求めるには「RANK() OVER (ORDER BY ~)」とする。
指定した列名の順にランキングを返してくれる。
①単純にランク順を取得するサンプル
では実際に単純にランク順を取得するサンプルを紹介する。
サンプルデータは以下のようなものとする。
サンプルデータ
studentテーブル
stu_no | subject | score |
1 | 理科 | 72 |
2 | 理科 | 81 |
3 | 数学 | 99 |
4 | 数学 | 60 |
--点数のランクを取得する
SELECT
stu_no,
subject,
score,
RANK() OVER (ORDER BY score) score_rank
FROM
student
ORDER BY
score_rank;
実行結果は以下のようになる
stu_no | subject | score | score rank |
4 | 数学 | 60 | 1 |
1 | 理科 | 72 | 2 |
2 | 理科 | 81 | 3 |
3 | 数学 | 99 | 4 |
上記では、「RANK() OVER (ORDER BY score)」と記述した結果、
「score」のランク順が点数に従って返ってきているのが分かるだろう。
②グループ毎にランク順を取得するパターン
次に、
グループ毎にランク順を取得するパターンを紹介する。
--列1のグループ毎に列2のランクを取得する
RANK() OVER (PARTITION BY 列1 ORDER BY 列2)
ランクはグループ化することも可能だ。
グループ化するには「PARTITION BY ~」を使用する。
列1のグループ毎に列2の順にランキングを返す。
②グループ化してランク順を取得するサンプル
では実際にグループ化してランク順を取得するサンプルを紹介する。
サンプルデータ
studentテーブル
stu_no | subject | score |
1 | 理科 | 72 |
2 | 理科 | 81 |
3 | 数学 | 99 |
4 | 数学 | 60 |
--科目別の点数のランクを取得する
SELECT
stu_no,
subject,
score,
RANK() OVER (PARTITION BY subject ORDER BY score) score_rank
FROM
student
ORDER BY
subject,
score_rank;
実行結果は以下のようになる
stu_no | subject | score | score rank |
1 | 理科 | 72 | 1 |
2 | 理科 | 81 | 2 |
4 | 数学 | 60 | 1 |
3 | 数学 | 99 | 2 |
上記は、以下のような動き方をしている。
- 「PARTITION BY subject」として「subject」毎にグループ化し、
- グループ化した中で「score」をランク順に並び替えを行う。
つまり、結果として、科目(subject)毎に点数のランクを取得したことになる。
関連記事
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions141.htm
http://oracle.se-free.com/dml/06_rank.html