(Oracle) RANKで指定列のランク順を取得する

(Oracle) RANKで指定列のランク順を取得する

 

本記事では、
Oracleでランク順をもとめることができるRANK関数の使い方ついて解説していく。

 

RANK –ランクを計算する–

Oracleの「RANK」関数を使えば、
指定列のランク順をもとめることが可能だ。

 

RANKの使い方

RANKの使い方は大きく分けると、
以下の2パターンが存在する。

RANKの使い方2パターン
  1. 単純にランク順を取得するパターン
  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

 

上記は、以下のような動き方をしている。

  1. 「PARTITION BY subject」として「subject」毎にグループ化し、
  2. グループ化した中で「score」をランク順に並び替えを行う。

 

つまり、結果として、科目(subject)毎に点数のランクを取得したことになる。

 

関連記事

(Oracle) LISTAGGで複数行を1行に集約する
(Oracle) DISTINCT でselect結果から重複を無くす

https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions141.htm

http://oracle.se-free.com/dml/06_rank.html

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。