하지만 똑같은 점수를 가진 사람이 존재하면 표현하기 어렵습니다.
예를 들면.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(ORDERBY sal DESC)AS rk FROM emp;
EMPNO ENAME SAL RK
--------- ---------- ---------- ----------7839 KING 500017788 SCOTT 300027902 FORD 300027566 JONES 297547698 BLAKE 285057782 CLARK 245067499 ALLEN 160077844 TURNER 150087934 MILLER 130097521 WARD 1250107654 MARTIN 1250107876 ADAMS 1100127900 JAMES 950137369 SMITH 80014
그룹별로 순위를 부여 하는 예제
위 예제는 deptno를 파티션으로 나누어서 부서별로 순위를 부여 합니다.
특정한 그룹별로 순위를 부여하고 싶을때 사용 하면 편합니다.
SQL>SELECT deptno, ename, sal, RANK()OVER(PARTITION BY deptno ORDERBY sal DESC)AS rk FROM emp ;
DEPTNO ENAME SAL RK
------- ---------- ---------- ---------10 KING 5000110 CLARK 2450210 MILLER 1300320 SCOTT 3000120 FORD 3000120 JONES 2975320 ADAMS 1100420 SMITH 800530 BLAKE 2850130 ALLEN 1600230 TURNER 1500330 WARD 1250430 MARTIN 1250430 JAMES 9506
DENSE_RANK() 함수
DENSE_RANK( ) : 중복 RANK의 수와 무관하게 numbering을 합니다.
1등, 2등, 2등 이렇게 2등이 중복되었는데 4등이 아니라 3등이 부여 됩니다.
SQL>SELECT empno, ename, sal, DENSE_RANK()OVER(ORDERBY sal DESC)AS rk FROM emp;
EMPNO ENAME SAL RK
--------- ---------- ---------- ---------7839 KING 500017788 SCOTT 300027902 FORD 300027566 JONES 297537698 BLAKE 285047782 CLARK 245057499 ALLEN 160067844 TURNER 150077934 MILLER 130087521 WARD 125097654 MARTIN 125097876 ADAMS 1100107900 JAMES 950117369 SMITH 80012