Patrick's 데이터 세상
순위 함수 본문
순위 함수
* RANK 함수
- 특정 항목(컬럼)에 대한 순위를 구하는 함수
- 특정 범위(Partition) 내에서 순위를 구할 수도 있고 전체 데이터에 대한 순위를 구할 수도 있습니다.
EX)
SELECT JOB
, ENAME
, SAL
, RANK() OVER (ORDER BY SAL DESC) ALL_RANK
, RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;
- RANK() OVER(ORDER BY SAL DESC) : 전체에 대한 순위입니다.
- RANK() OVER(PARTITION BY JOB ORDER BY SAL DESC) : 각각 파티션 그룹 항목에 대한 순위입니다.
결과)
JOB |
ENAME |
SAL |
ALL_RANK |
JOB_RANK |
PRESIDENT |
KING |
5000 |
1 |
1 |
ANALYST |
FORD |
3000 |
2 |
1 |
ANALYST |
SCOTT |
3000 |
2 |
1 |
MANAGER |
JONES |
2975 |
4 |
1 |
MANAGER |
BLAKE |
2850 |
5 |
2 |
* DENSE_RANK 함수
- RANK 함수와 흡사하나, 동일한 순위를 하나의 건수로 취급하는 것이 다른 점입니다.
EX)
SELECT JOB
, ENAME
, SAL
, RANK() OVER (ORDER BY SAL DESC) RANK
, DENSE_RANK() OVER (ORDER BY SAL DESC) DENSE_RANK
FROM EMP;
- 사원데이터에서 급여가 높은 순서와 동일한 순위를 하나의 등수로 간주한 결과도 같이 출력
결과)
JOB |
ENAME |
SAL |
RANK |
DENSE_RANK |
PRESIDENT |
KING |
5000 |
1 |
1 |
ANALYST |
FORD |
3000 |
2 |
2 |
ANALYST |
SCOTT |
3000 |
2 |
2 |
MANAGER |
JONES |
2975 |
4 |
3 |
MANAGER |
BLAKE |
2850 |
5 |
4 |
- FORD와 SCOTT은 동일한 SALARY이므로 RANK와 DENSE_RANK 컬럼에서 모두 같은 순위를 부여합니다.
* ROW_NUMBER 함수
- RANK나 DENSE_RANK 함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, ROW_NUMBER는 동일한 값이라도 고유한 순위를 부여합니다.
EX)
SELECT JOB
, ENAME
, SAL
, RANK() OVER (ORDER BY SAL DESC) RANK
, ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;
- 급여가 높은 순서와 동일한 순위를 인정하지 않는 등수도 같이 출력한다.
결과)
JOB |
ENAME |
SAL |
RANK |
ROW_NUMBER |
PRESIDENT |
KING |
5000 |
1 |
1 |
ANALYST |
FORD |
3000 |
2 |
2 |
ANALYST |
SCOTT |
3000 |
2 |
3 |
MANAGER |
JONES |
2975 |
4 |
4 |
MANAGER |
BLAKE |
2850 |
5 |
5 |
데이터베이스 별로 다른 결과가 나올 수 있으므로, ROW_NUMBER() OVER (ORDER BY SAL DESC, ENAME) 같이 ORDER BY 절을 이용해 추가적인 정렬 기준을 정의해야 합니다.
'Programming > Oracle' 카테고리의 다른 글
그룹 내 행 순서 함수 (0) | 2020.06.21 |
---|---|
일반 집계 함수 (0) | 2020.06.21 |
텍스트 제어 함수 (0) | 2020.06.21 |
데이터 조작 함수 (0) | 2020.06.21 |
DCL - COMMIT, ROLLBACK, GRANT, REVOKE 구문 (0) | 2020.06.21 |