ORACLE RANK(순위) 함수
- RANK : 동일한 값이면 중복 순위를 부여하고, 다음 순위는 해당 개수만큼 건너뛰고 반환한다.
(중복 순위 다음 순서 건너뜀 - 1,2,2,4)
- DENSE_RANK : 동일한 값이면 중복 순위를 부여하고, 다음 순위는 중복 순위와 상관없이 순차적으로 반환한다.
(중복순위 다음 순위 연속 - 1,2,2,3)
- ROW_NUMBER : 중복 관계없이 순차적으로 순위를 반환한다.
(중복순위 없이 유일값 - 1,2,3,4)
RANK 함수
SELECT deptno, empno, sal
, RANK() OVER(ORDER BY sal DESC) rk
FROM emp
;
- 실행결과 : 급여가 같은 경우 동일 순위로 처리. 다음 순위 건너뜀.
DEPTNO |
EMPNO |
SAL |
RK |
10 |
7839 |
5000 |
1 |
20 |
7788 |
3000 |
2 |
20 |
7902 |
3000 |
2 |
20 |
7566 |
2975 |
4 |
30 |
7698 |
2850 |
5 |
10 |
7782 |
2450 |
6 |
-
부서별(PARTITION BY deptno)로 급여가 높은 순서대로(ORDER BY sal DESC) 순위를 구하는 예제
SELECT deptno, empno, sal
, RANK() OVER(PARTITION BY deptno
ORDER BY sal DESC) rk
FROM emp
;
-
실행결과
DEPTNO |
EMPNO |
SAL |
RK |
10 |
7839 |
5000 |
1 |
10 |
7782 |
2450 |
2 |
10 |
7934 |
1300 |
3 |
20 |
7788 |
3000 |
1 |
20 |
7902 |
3000 |
1 |
20 |
7566 |
2975 |
3 |
순위함수의 특징
- ORDER BY는 생략할 수 없다.
- WINDOWING 절은 사용할 수 없다.
순위함수 비교
SELECT deptno, empno, sal
, RANK() OVER(ORDER BY sal DESC) rk
, DENSE_RANK() OVER(ORDER BY sal DESC) dr
, ROW_NUMBER() OVER(ORDER BY sal DESC) rn
FROM emp
;
DEPTNO |
EMPNO |
SAL |
RK |
DR |
RN |
10 |
7839 |
5000 |
1 |
1 |
1 |
20 |
7788 |
3000 |
2 |
2 |
2 |
20 |
7902 |
3000 |
2 |
2 |
3 |
20 |
7566 |
2975 |
4 |
3 |
4 |
30 |
7698 |
2850 |
5 |
4 |
5 |
10 |
7782 |
2450 |
6 |
5 |
6 |
30 |
7499 |
1600 |
7 |
6 |
7 |
30 |
7844 |
1500 |
8 |
7 |
8 |
10 |
7934 |
1300 |
9 |
8 |
9 |
30 |
7521 |
1250 |
10 |
9 |
10 |
30 |
7654 |
1250 |
10 |
9 |
11 |
20 |
7876 |
1100 |
12 |
10 |
12 |
30 |
7900 |
950 |
13 |
11 |
13 |
20 |
7369 |
800 |
14 |
12 |
14 |
NTILE(분류)
- NTILE 함수는 쿼리의 결과를 n개의 그룹으로 분류하는 기능을 제공한다.
아래 예제에서 GRP2는 두 개의 그룹으로, GRP3는 세 개의 그룹으로, GRP5는 다섯개의 그룹으로 분류하는 것을 알 수 있다.
SELECT empno
, NTILE(2) OVER(ORDER BY empno) grp2
, NTILE(3) OVER(ORDER BY empno) grp3
, NTILE(5) OVER(ORDER BY empno) grp5
FROM emp
;
EMPNO |
GRP2 |
GRP3 |
GRP5 |
7369 |
1 |
1 |
1 |
7499 |
1 |
1 |
1 |
7521 |
1 |
1 |
1 |
7566 |
1 |
1 |
2 |
7654 |
1 |
1 |
2 |
7698 |
1 |
2 |
2 |
7782 |
1 |
2 |
3 |
7788 |
2 |
2 |
3 |
7839 |
2 |
2 |
3 |
7844 |
2 |
2 |
4 |
7876 |
2 |
3 |
4 |
7900 |
2 |
3 |
4 |
7902 |
2 |
3 |
5 |
7934 |
2 |
3 |
5 |
NTILE : 지정한 숫자만큼의 그룹으로 분류
출처:구루비