@グループ単位に、ランキングを表示する(RANK、DENSE_RANK)
按分组进行排序时使用的函数
RANK関数、DENSE_RANK関数
グループ単位に、ランキングを表示するには、RANK関数、DENSE_RANK関数を使用する。
分析関数のRANK、DENSE_RANKは、ウィンドウ(window)を操作してランキングを取得します。
RANK() 検索レコードの表示順にランキングする
同じ値の場合のランキング方法がそれぞれ異なり、RANK関数は、順位を飛ばし、DENSE_RANK関数は順位を飛ばさずに振ります
DENSE_RANK()
OVER( PRTITION BY 項目1,
[項目2,・・・]
ORDER BY 項目1,
[項目2,・・・] ) RANK関数、DENSE_RANK関数と一緒に使用します
PRTITION BY句には、グループ化対象項目を指定する
ORDERY BY句には、ランキング対象の項目を指定する
サンプル表「emp」データ
SQL> select * from emp;
EMP DEP JOB FIRST_NAME LAST_NAME SALARY
E01 D01 J01 名字1 名前1 100
E02 D01 J01 名前2 名前2 250
E03 D02 J02 名前3 名前3 200
E04 D02 J03 名前4 名前4 200
E05 D02 J03 名前5 名前5 130
E06 D03 J03 名前6 名前6 150
例1) 列「salary」の小さい順にランキング表示する(RANK)
SQL> select
2 emp_id,dept_id,job_id,salary,
3 rank() over(order by salary)
4 from emp;
EMP DEP JOB SALARY RANK()OVER(ORDERBYSALARY)
— --- — ---------- -------------------------
E01 D01 J01 100 1
E05 D02 J03 130 2
E06 D03 J03 150 3
E04 D02 J03 200 4
E03 D02 J02 200 4
E02 D01 J01 250 6
例2) 列「salary」の小さい順にランキング表示する(DENSE_RANK)
SQL> select
2 emp_id,dept_id,job_id,salary,
3 dense_rank() over(order by salary)
4 from emp;
EMP DEP JOB SALARY DENSE_RANK()OVER(ORDERBYSALARY)
— --- — ---------- -------------------------------
E01 D01 J01 100 1
E05 D02 J03 130 2
E06 D03 J03 150 3
E04 D02 J03 200 4
E03 D02 J02 200 4
E02 D01 J01 250 5
例3) 列「dept_id」別に「salary」の小さい順にランキング表示する
SQL> select
2 emp_id,dept_id,job_id,salary,
3 rank() over(partition by dept_id order by salary)
4 from emp;
EMP DEP JOB SALARY RANK()OVER(PARTITIONBYDEPT_IDORDERBYSALARY)
— --- — ---------- -------------------------------------------
E01 D01 J01 100 1
E02 D01 J01 250 2
E05 D02 J03 130 1
E04 D02 J03 200 2
E03 D02 J02 200 2
E06 D03 J03 150 1