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