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