【Oracle】RANK関数でデータの順位を付ける方法

Oracleデータベースでデータの順位を付けるために使用されるRANK関数について紹介します。

スポンサーリンク

RANK関数とは?

RANK関数は、指定された順序に基づいてデータの順位を付けるために使用されます。同じ値のデータが存在する場合は同じランクが付与され、次のランクはスキップされるという特徴があります。

RANK関数の基本構文

まず、RANK関数の基本的な構文を見てみましょう。

RANK() OVER ([PARTITION BY partition_expression] ORDER BY order_expression)
  • PARTITION BY: データを特定のグループに分けるために使用します(オプション)。
  • ORDER BY: ランキングを付けるためのソート基準を指定します。

シンプルなRANK関数の使用例

従業員のテーブル(EMPLOYEES)があり、各従業員の給与(SALARY)に基づいてランクを付けたい場合は、以下のようにクエリを記述します。

SELECT 
    EMPLOYEE_ID,
    SALARY,
    RANK() OVER (ORDER BY SALARY DESC) AS SALARY_RANK
FROM 
    EMPLOYEES;

このクエリは、従業員の給与に基づいて降順でランクを付け、結果を表示します。

部門ごとのランクを取得する方法

部門ごとに従業員の給与に基づいてランクを付けたい場合、PARTITION BY句を使用します。以下の例を見てください。

SELECT 
    DEPARTMENT_ID,
    EMPLOYEE_ID,
    SALARY,
    RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS DEPT_SALARY_RANK
FROM 
    EMPLOYEES;

このクエリは、各部門ごとに従業員の給与をランク付けし、部門内での順位を表示します。

同じランクが存在する場合の挙動

同じ給与の従業員が複数いる場合のRANK関数の挙動を確認してみましょう。以下のようなデータがあるとします。

EMPLOYEE_ID SALARY
1 5000
2 4500
3 4500
4 4000

上記のクエリを実行すると、結果は次のようになります。

EMPLOYEE_ID SALARY SALARY_RANK
1 5000 1
2 4500 2
3 4500 2
4 4000 4

ここで、EMPLOYEE_ID 2と3は同じ給与のため、同じランク2が付けられ、次のランクは4になります。

よくある質問(FAQ)

Q. RANK()とDENSE_RANK()の違いは何ですか?
A. RANK()は同順位がある場合に次の順位をスキップします(例: 1,1,3)。DENSE_RANK()は連続した順位を返します(例: 1,1,2)。
Q. RANK()とROW_NUMBER()の違いは何ですか?
A. ROW_NUMBER()は同順位でも一意の連番を振ります(例: 1,2,3)。RANK()は同順位に同じ番号を割り当てます(例: 1,1,3)。
Q. グループごとにランキングを付けるには?
A. RANK() OVER (PARTITION BY グループ列 ORDER BY スコア列 DESC)のようにPARTITION BY句でグループを指定します。
Q. ランキング上位N件を取得するには?
A. WITH句でRANK()を計算してから外側のSELECTでWHERE rank_col <= Nで絞り込みます。
Q. RANK()のORDER BYで複数列を指定できますか?
A. はい。RANK() OVER (ORDER BY col1 DESC, col2 ASC)のように複数列を指定できます。

関連記事

まとめ

OracleのRANK関数を使えば、データセットに対して簡単に順位を付けることができます。同じランクのデータがある場合でも、スキップされたランクによりデータ分析が容易になります。PARTITION BY句を使用することで、特定のグループごとにランクを付けることも可能です。ぜひ、このガイドを参考にして、RANK関数を使ったデータ分析を実践してみてください。