사용자 도구

사이트 도구


dbms:oracle:devel:rank

Oracle RANK() Function

  1. 일반적으로 순위는 ODRDER BY DESC 를 통해 볼수가 있습니다.
  2. 하지만 똑같은 점수를 가진 사람이 존재하면 표현하기 어렵습니다.
    예를 들면.100, 90, 90, 80 이렇게 점수가 나오면, 순위를 1,2,2,4 이렇게 부여 해야 합니다
  3. 오라클 8.1.6 버전부터는 RANK() 함수를 통해 쉽게 구현할 수 있습니다.
    버젼이 낮으면 ORA-923 ERROR 발생
  4. PLSQL 내에서는 Oracle 9i 부터 가능합니다.
    버젼이 낮으면 ORA-900 ERROR 발생

순위부여 하는 예제

  1. RANK() 함수를 사용하여 급여 순으로 순위를 부여한 예제 입니다.
  2. RK의 출력값을 보면 급여가 같으면 같은 순위로 부여가 됩니다.
    SQL> conn scott/tiger
    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

그룹별로 순위를 부여 하는 예제

  1. 위 예제는 deptno를 파티션으로 나누어서 부서별로 순위를 부여 합니다.
  2. 특정한 그룹별로 순위를 부여하고 싶을때 사용 하면 편합니다.
    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  
dbms/oracle/devel/rank.txt · 마지막으로 수정됨: 2007/07/02 02:58 저자 starlits