199

RANK()DENSE_RANK()関数はどう違いますか?emptbl次の表で n 番目の給与を調べる方法は?

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

4

10 に答える 10

306

RANK()順序付けられたパーティション内のランキングを提供します。同順位には同じ順位が割り当てられ、次の順位はスキップされます。したがって、ランク 2 のアイテムが 3 つある場合、リストされている次のランクはランク 5 になります。

DENSE_RANK()再び、順序付けられたパーティション内のランキングを示しますが、ランクは連続しています。複数の項目があるランクがある場合、ランクはスキップされません。

nullについては、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.

ここに良い説明といくつかの例へのリンクがあります。

于 2012-06-25T04:43:03.883 に答える
18

rank() : 行のグループ内でレコードをランク​​付けするために使用されます。

Dense_rank() : DENSE_RANK 関数は、連続したランクを割り当てることを除いて、RANK 関数のように機能します。

クエリ -

select 
    ENAME,SAL,RANK() over (order by SAL) RANK
from 
    EMP;

出力 -

+--------+------+------+
| ENAME  | SAL  | RANK |
+--------+------+------+
| SMITH  |  800 |    1 |
| JAMES  |  950 |    2 |
| ADAMS  | 1100 |    3 |
| MARTIN | 1250 |    4 |
| WARD   | 1250 |    4 |
| TURNER | 1500 |    6 |
+--------+------+------+

クエリ -

select 
    ENAME,SAL,dense_rank() over (order by SAL) DEN_RANK
from 
    EMP;

出力 -

+--------+------+-----------+
| ENAME  | SAL  |  DEN_RANK |
+--------+------+-----------+
| SMITH  |  800 |         1 |
| JAMES  |  950 |         2 |
| ADAMS  | 1100 |         3 |
| MARTIN | 1250 |         4 |
| WARD   | 1250 |         4 |
| TURNER | 1500 |         5 |
+--------+------+-----------+
于 2016-08-05T05:28:36.263 に答える
10
SELECT empno,
       deptno,
       sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          4
      7499         30       1600          5
      7698         30       2850          6


SELECT empno,
       deptno,
       sal,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          3
      7499         30       1600          4
      7698         30       2850          5
于 2013-12-10T10:35:05.897 に答える
2

RANK() 関数と DENSE_RANK() 関数の唯一の違いは、「同点」の場合です。つまり、セット内の複数の値が同じランキングを持つ場合です。このような場合、RANK() は連続していない「ランク」をセット内の値に割り当てます (同点の場合、整数のランキング値の間にギャップが生じます)。一方、DENSE_RANK() は連続したランクをセット内の値に割り当てます。設定します (したがって、引き分けの場合に整数ランキング値の間にギャップはありません)。

たとえば、セット {25, 25, 50, 75, 75, 100} を考えてみましょう。このようなセットの場合、RANK() は {1, 1, 3, 4, 4, 6} を返します (値 2 と 5 はスキップされることに注意してください)、DENSE_RANK() は {1,1,2,3, 3,4}。

于 2016-04-29T07:34:30.227 に答える