RANK, DENSE_RANK

順位の取得を行います。

RANKDENSE_RANKは、順位の評価を行った際に同位のレコードがあったときの採番方法に違いがあります。
RANKでは同位があった場合順位を飛ばし、DENSE_RANKでは順位を飛ばしません

-- Oracle
RANK ( ) OVER ( [ PARTITION BY partition_expression [,partition_expression ...] ]
    ORDER BY order_expression [,order_expression ...] )

DENSE_RANK ( ) OVER ( [ PARTITION BY partition_expression [,partition_expression ...] ]
    ORDER BY order_expression [,order_expression ...] )

return : 順位
partition_expression : パーティションを指定する式
order_expression : 順位を決定するための式

 

*
下記のテーブルがあるとき…

社員マスタ

社員番号 名前 所属部署コード 月給
1 しゃちょさん 100 1000000
2 部長さん 200 600000
3 主任さん 220 400000
4 Aさん 220 200000
5 Bさん 220 300000
6 Cさん 220 300000

 

*
社員マスタの給与の高い順に順位をつける場合、以下のように記述します。
(順位を飛ばす場合)

SELECT RANK()OVER(ORDER BY 給与 DESC) AS "順位",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

順位 社員番号 名前 所属部署コード 月給
1 1 しゃちょさん 100 1000000
2 2 部長さん 200 600000
3 3 主任さん 220 400000
4 5 Bさん 220 300000
4 6 Cさん 220 300000
6 4 Aさん 220 200000

 

*
社員マスタの給与の高い順に順位をつける場合、以下のように記述します。
(順位を飛ばさない場合)

SELECT DENSE_RANK()OVER(ORDER BY 給与 DESC) AS "順位",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

順位 社員番号 名前 所属部署コード 月給
1 1 しゃちょさん 100 1000000
2 2 部長さん 200 600000
3 3 主任さん 220 400000
4 5 Bさん 220 300000
4 6 Cさん 220 300000
5 4 Aさん 220 200000

 

*
社員マスタの所属部署コード毎に給与の高い順に順位をつける場合、以下のように記述します。
(順位を飛ばす場合)

SELECT RANK()OVER(PARTITION BY 所属部署コード ORDER BY 給与 DESC) AS "順位",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

順位 社員番号 名前 所属部署コード 月給
1 1 しゃちょさん 100 1000000
1 2 部長さん 200 600000
1 3 主任さん 220 400000
2 5 Bさん 220 300000
2 6 Cさん 220 300000
4 4 Aさん 220 200000

 

*
社員マスタの所属部署コード毎に給与の高い順に順位をつける場合、以下のように記述します。
(順位を飛ばさない場合)

SELECT DENSE_RANK()OVER(PARTITION BY 所属部署コード ORDER BY 給与 DESC) AS "順位",
       社員番号, 名前, 所属部署コード, 給与
  FROM 社員マスタ
;

結果

順位 社員番号 名前 所属部署コード 月給
1 1 しゃちょさん 100 1000000
1 2 部長さん 200 600000
1 3 主任さん 220 400000
2 5 Bさん 220 300000
2 6 Cさん 220 300000
3 4 Aさん 220 200000

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です