본문 바로가기

DataBase/Oracle

오라클에서 순위를 쉽게 부여하는법(Rank() Function)

우리가 일반적으로 점수의 순위는 ODRDER BY desc를 해서 볼수가 있습니다.

하지만 똑같은 점수를 가진 사람들이 많이 나올때..
예를 들면.100, 90, 90, 80 이렇게 점수가 나오면..
순위를 1,2,2,4 이렇게 부여 해야 합니다
 
이거 SQL문으로 할려고 하니 어렵더라구요.. 내 머리가 나쁜건지..

암튼 오라클 8.1.6 버전부터는 아주 쉽게 순위를 부여 할 수 있습니다..

아래 내용을 참고해 보세요...
 


오라클에서는 RANK Function을 사용해서 순위를 간편하게 부여할 수 있습니다.
 
RANK Function는 oracle 8i(8.1.6) 부터 가능합니다.
8.1.6 이전 버전에서는 사용 할 수 없습니다. ORA-923 error 가 발생 합니다.
 
plsql 내에서는 oracle 9i 부터 가능합니다.  8.1.6에서는 ORA-900 error가 발생 합니다.
 
-- scott유저로 접속을 합니다.
SQLPLUS scott/tiger
 

-- RANK() 함수를 사용하여 급여 순으로 순위를 부여한 예제 입니다. 
-- RK의 출력값을 보면 급여가 같으면 같은 순위로 부여가 됩니다.

SQL>SELECT empno, ename, sal,
        RANK() OVER (ORDER BY sal DESC ) as rk
        FROM emp;

    EMPNO ENAME             SAL         RK
--------- ---------- ---------- ----------
     7839 KING               5000          1
     7788 SCOTT            3000          2
     7902 FORD              3000          2
     7566 JONES            2975          4
     7698 BLAKE            2850          5
     7782 CLARK            2450          6
     7499 ALLEN            1600          7
     7844 TURNER          1500          8
     7934 MILLER           1300          9
     7521 WARD             1250         10
     7654 MARTIN            1250         10
     7876 ADAMS            1100         12
     7900 JAMES             950         13
     7369 SMITH              800         14


 


☞ 그룹별로 순위를 부여 하는 법

-- 위 예제는 deptno를 파티션으로 나누어서 부서별로 순위를 부여 합니다.
-- 특정한 그룹별로 순위를 부여하고 싶을때 사용 하면 편합니다.

SQL>SELECT deptno, ename, sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal DESC ) as rk
       FROM emp ;
 
 DEPTNO ENAME             SAL        RK
------- ---------- ---------- ---------
     10 KING              5000          1
     10 CLARK            2450         2
     10 MILLER           1300         3
     20 SCOTT            3000         1
     20 FORD             3000          1
     20 JONES            2975         3
     20 ADAMS            1100         4
     20 SMITH             800           5
     30 BLAKE            2850          1
     30 ALLEN            1600          2
     30 TURNER           1500        3
     30 WARD             1250          4
     30 MARTIN           1250         4
     30 JAMES             950          6
 


☞ DENSE_RANK() 함수

 DENSE_RANK( ) - 중복 RANK의 수와 무관하게 numbering을 합니다.

-- 1등, 2등, 2등 이렇게 2등이 중복되었는데 4등이 아니라 3등이 부여 됩니다.

SQL>SELECT empno, ename, sal, 
       DENSE_RANK() OVER (ORDER BY sal DESC ) as rk
       FROM emp;    
   
    EMPNO ENAME             SAL        RK
--------- ---------- ---------- ---------
     7839 KING               5000         1
     7788 SCOTT            3000         2
     7902 FORD              3000         2
     7566 JONES            2975         3
     7698 BLAKE             2850         4
     7782 CLARK             2450         5
     7499 ALLEN             1600         6
     7844 TURNER          1500         7
     7934 MILLER            1300         8
     7521 WARD             1250         9
     7654 MARTIN           1250         9
     7876 ADAMS            1100        10
     7900 JAMES             950        11
     7369 SMITH             800        12