복붙노트

[SQL] RANK ()와 DENSE_RANK () 오라클 함수의 차이점은 무엇입니까?

SQL

RANK ()와 DENSE_RANK () 오라클 함수의 차이점은 무엇입니까?

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

테이블에 데이터가 널 (null)을 가진 경우 나 n 번째 월급을 찾으려면, 어떤 일이 일어날 것인가?

해결법

  1. ==============================

    1.RANK는 당신에게 당신의 주문 파티션 내에서 순위를 제공합니다. 넥타이는 다음 순위 (들)와 같은 순위를 할당 건너 뜁니다. 당신이 순위 2에서 3 개 항목이 경우에 따라서, 나열된 다음 순위 5 위를 기록된다.

    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.
    

    여기에 좋은 설명하고 몇 가지 예에 대한 링크입니다.

  2. ==============================

    2.여기에이 문서 멋지게 설명합니다. 기본적으로, 당신은 그것을 볼 수 있습니다 :

    여기에이 문서 멋지게 설명합니다. 기본적으로, 당신은 그것을 볼 수 있습니다 :

    CREATE TABLE t AS
    SELECT 'a' v FROM dual UNION ALL
    SELECT 'a'   FROM dual UNION ALL
    SELECT 'a'   FROM dual UNION ALL
    SELECT 'b'   FROM dual UNION ALL
    SELECT 'c'   FROM dual UNION ALL
    SELECT 'c'   FROM dual UNION ALL
    SELECT 'd'   FROM dual UNION ALL
    SELECT 'e'   FROM dual;
    
    SELECT
      v,
      ROW_NUMBER() OVER (ORDER BY v) row_number,
      RANK()       OVER (ORDER BY v) rank,
      DENSE_RANK() OVER (ORDER BY v) dense_rank
    FROM t
    ORDER BY v;
    

    위의 의지 수율 :

    +---+------------+------+------------+
    | V | ROW_NUMBER | RANK | DENSE_RANK |
    +---+------------+------+------------+
    | a |          1 |    1 |          1 |
    | a |          2 |    1 |          1 |
    | a |          3 |    1 |          1 |
    | b |          4 |    4 |          2 |
    | c |          5 |    5 |          3 |
    | c |          6 |    5 |          3 |
    | d |          7 |    7 |          4 |
    | e |          8 |    8 |          5 |
    +---+------------+------+------------+
    

  3. ==============================

    3.

    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
    
  4. ==============================

    4.순위 () : 행의 그룹 내에서 레코드 순위를 매기는 데 사용됩니다.

    순위 () : 행의 그룹 내에서 레코드 순위를 매기는 데 사용됩니다.

    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 |
    +--------+------+-----------+
    
  5. ==============================

    5.

    select empno
           ,salary
           ,row_number() over(order by salary desc) as Serial
           ,Rank() over(order by salary desc) as rank
           ,dense_rank() over(order by salary desc) as denseRank
    from emp ;
    

    ROW_NUMBER () -> 일련 번호를 생성하는 데 사용

    DENSE_RANK ()는 연속 순위를 줄 것이다하지만 순위는 순위의 충돌의 경우에 순위를 건너 뜁니다.

  6. ==============================

    6.랭크 () 및 DENSE_RANK 유일한 차이점은 () 함수는 "타이"로되는 경우에; 즉, 다중 세트의 값이 동일한 순위를 가질 경우이다. DENSE_RANK ()가있는 값으로 연속 된 순위를 지정하는 반면 이러한 경우, RANK ()는 (a 동점이있을 때의 값의 순위를 정수 사이의 갭의 결과로) 집합의 값에 대한 비 연속 "랭크"를 할당 할 세트 (그래서 타이의 경우에 값 순위 정수 간의 간격이 없어야한다).

    랭크 () 및 DENSE_RANK 유일한 차이점은 () 함수는 "타이"로되는 경우에; 즉, 다중 세트의 값이 동일한 순위를 가질 경우이다. DENSE_RANK ()가있는 값으로 연속 된 순위를 지정하는 반면 이러한 경우, RANK ()는 (a 동점이있을 때의 값의 순위를 정수 사이의 갭의 결과로) 집합의 값에 대한 비 연속 "랭크"를 할당 할 세트 (그래서 타이의 경우에 값 순위 정수 간의 간격이 없어야한다).

    예를 들어, 세트 {25, 25, 50, 75, 75, 100}을 고려한다. 이러한 세트의 경우, RANK ()가 반환 {1, 1, 3, 4, 4, 6} (숫자 2 및도 5는 생략한다), 반면 DENSE_RANK는 (), 1,1,2,3 {반환 3,4}.

  7. ==============================

    7.랭크 () SQL 함수 값들의 순서화 된 세트 그러나 이전 등급 특정 행 ROW_NUMBER 후 다음 랭크에서의 데이터의 순위를 생성한다. 한편, DENSE_RANK () SQL 함수는 다음 번호 대신 발생 ROW_NUMBER를 생성한다. 아래의 개념을 명확히 할 SQL의 예입니다 :

    랭크 () SQL 함수 값들의 순서화 된 세트 그러나 이전 등급 특정 행 ROW_NUMBER 후 다음 랭크에서의 데이터의 순위를 생성한다. 한편, DENSE_RANK () SQL 함수는 다음 번호 대신 발생 ROW_NUMBER를 생성한다. 아래의 개념을 명확히 할 SQL의 예입니다 :

    Select ROW_NUMBER() over (order by Salary) as RowNum, Salary, 
    RANK() over (order by Salary) as Rnk, 
    DENSE_RANK() over (order by Salary) as DenseRnk from (
    Select 1000 as Salary union all
    Select 1000 as Salary union all
    Select 1000 as Salary union all
    Select 2000 as Salary union all
    Select 3000 as Salary union all
    Select 3000 as Salary union all
    Select 8000 as Salary union all
    Select 9000 as Salary) A
    

    그것은 다음과 같은 출력을 생성합니다 :

    ----------------------------
    RowNum  Salary  Rnk DenseRnk
    ----------------------------
    1       1000    1   1
    2       1000    1   1
    3       1000    1   1
    4       2000    4   2
    5       3000    5   3
    6       3000    5   3
    7       8000    7   4
    8       9000    8   5
    
  8. ==============================

    8.순위와 DENSE_RANK는 분할 된 데이터 집합의 순위를 제공합니다.

    순위와 DENSE_RANK는 분할 된 데이터 집합의 순위를 제공합니다.

    순위는 () : 그것은 당신에게 연속 정수 번호를 제공하지 않습니다.

    DENSE_RANK는 () : 그것은 당신에게 연속 정수 번호를 제공합니다.

    그것은 ROW_NUMBER 고려로 상기 사진에서 10,008 지퍼의 랭크는 랭크 () 함수에 의해 2 DENSE_RANK () 함수 (24)이다.

  9. from https://stackoverflow.com/questions/11183572/whats-the-difference-between-rank-and-dense-rank-functions-in-oracle by cc-by-sa and MIT license