본문 바로가기

개발개발/db

[ORACLE] RANK(순위) 함수

ORACLE RANK(순위) 함수

  • Oracle에서 제공하는 순위 함수 3가지
  1. RANK : 동일한 값이면 중복 순위를 부여하고, 다음 순위는 해당 개수만큼 건너뛰고 반환한다.
    (중복 순위 다음 순서 건너뜀 - 1,2,2,4)
  2. DENSE_RANK : 동일한 값이면 중복 순위를 부여하고, 다음 순위는 중복 순위와 상관없이 순차적으로 반환한다.
    (중복순위 다음 순위 연속 - 1,2,2,3)
  3. ROW_NUMBER : 중복 관계없이 순차적으로 순위를 반환한다.
    (중복순위 없이 유일값 - 1,2,3,4)

RANK 함수

  • 급여가 높은 순서대로 순위를 구하는 예제
SELECT deptno, empno, sal
   , RANK() OVER(ORDER BY sal DESC) rk
FROM emp
;
  • 실행결과 : 급여가 같은 경우 동일 순위로 처리. 다음 순위 건너뜀.
DEPTNO EMPNO SAL RK
10 7839 5000 1
20 7788 3000 2
20 7902 3000 2
20 7566 2975 4
30 7698 2850 5
10 7782 2450 6
  • 부서별(PARTITION BY deptno)로 급여가 높은 순서대로(ORDER BY sal DESC) 순위를 구하는 예제

    SELECT deptno, empno, sal
       , RANK() OVER(PARTITION BY deptno
                         ORDER BY sal DESC) rk
    FROM emp
    ;
  • 실행결과

DEPTNO EMPNO SAL RK
10 7839 5000 1
10 7782 2450 2
10 7934 1300 3
20 7788 3000 1
20 7902 3000 1
20 7566 2975 3

순위함수의 특징

  • ORDER BY는 생략할 수 없다.
  • WINDOWING 절은 사용할 수 없다.

순위함수 비교

SELECT deptno, empno, sal
     , RANK()       OVER(ORDER BY sal DESC) rk
     , DENSE_RANK() OVER(ORDER BY sal DESC) dr
     , ROW_NUMBER() OVER(ORDER BY sal DESC) rn
FROM emp
;
  • 실행결과
DEPTNO EMPNO SAL RK DR RN
10 7839 5000 1 1 1
20 7788 3000 2 2 2
20 7902 3000 2 2 3
20 7566 2975 4 3 4
30 7698 2850 5 4 5
10 7782 2450 6 5 6
30 7499 1600 7 6 7
30 7844 1500 8 7 8
10 7934 1300 9 8 9
30 7521 1250 10 9 10
30 7654 1250 10 9 11
20 7876 1100 12 10 12
30 7900 950 13 11 13
20 7369 800 14 12 14

NTILE(분류)

  • NTILE 함수는 쿼리의 결과를 n개의 그룹으로 분류하는 기능을 제공한다.
    아래 예제에서 GRP2는 두 개의 그룹으로, GRP3는 세 개의 그룹으로, GRP5는 다섯개의 그룹으로 분류하는 것을 알 수 있다.
SELECT empno
     , NTILE(2) OVER(ORDER BY empno) grp2
     , NTILE(3) OVER(ORDER BY empno) grp3
     , NTILE(5) OVER(ORDER BY empno) grp5
  FROM emp
;
EMPNO GRP2 GRP3 GRP5
7369 1 1 1
7499 1 1 1
7521 1 1 1
7566 1 1 2
7654 1 1 2
7698 1 2 2
7782 1 2 3
7788 2 2 3
7839 2 2 3
7844 2 2 4
7876 2 3 4
7900 2 3 4
7902 2 3 5
7934 2 3 5

NTILE : 지정한 숫자만큼의 그룹으로 분류

출처:구루비