1. ホーム
  2. sql

[解決済み】OracleのRANK()関数とDENSE_RANK()関数の違いは何ですか?

2022-04-15 11:07:09

質問

とはどう違うのですか? RANK()DENSE_RANK() という関数はありますか?次のような場合、何番目の給料かを調べるにはどうしたらよいでしょうか? emptbl テーブル?

DEPTNO  EMPNAME    SAL
------------------------------
10       rrr    10000.00
11       nnn    20000.00
11       mmm    5000.00
12       kkk    30000.00
10       fff    40000.00
10       ddd    40000.00
10       bbb    50000.00
10       ccc    50000.00

を持つテーブルデータの場合 nulls を調べたい場合、どうなりますか? nth 給料は?

解決方法は?

RANK() は、順序付きパーティション内での順位を与えます。同順位は同じ順位になり、次の順位はスキップされます。つまり、ランク2の商品が3つある場合、次のランクはランク5となります。

DENSE_RANK() も順序付きパーティション内での順位を与えますが、順位は連続します。複数の項目からなる順位がある場合、その順位がスキップされることはありません。

ヌルについては ORDER BY 節があります。ここに簡単なテストスクリプトがあるので、これで何が起こるか遊んでみてください。

with q as (
select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all
select 11, 'nnn', 20000.00 from dual union all
select 11, 'mmm', 5000.00 from dual union all
select 12, 'kkk', 30000 from dual union all
select 10, 'fff', 40000 from dual union all
select 10, 'ddd', 40000 from dual union all
select 10, 'bbb', 50000 from dual union all
select 10, 'xxx', null from dual union all
select 10, 'ccc', 50000 from dual)
select empname, deptno, sal
     , rank() over (partition by deptno order by sal nulls first) r
     , dense_rank() over (partition by deptno order by sal nulls first) dr1
     , dense_rank() over (partition by deptno order by sal nulls last) dr2
 from q; 

EMP     DEPTNO        SAL          R        DR1        DR2
--- ---------- ---------- ---------- ---------- ----------
xxx         10                     1          1          4
rrr         10      10000          2          2          1
fff         10      40000          3          3          2
ddd         10      40000          3          3          2
ccc         10      50000          5          4          3
bbb         10      50000          5          4          3
mmm         11       5000          1          1          1
nnn         11      20000          2          2          2
kkk         12      30000          1          1          1

9 rows selected.

以下はリンクです。 には、良い説明といくつかの例があります。