728x90

1. RANK 함수란 무엇인가?
RANK 함수는 분석 함수의 일종으로, 특정 정렬 기준에 따라 순위(rank)를 부여하는 SQL 함수입니다. 동일한 값에는 동일한 순위가 부여되며, 그다음 순위는 건너뜁니다(즉, 중복 순위 발생 시 GAP 있음).
📌 기본 문법
RANK() OVER (PARTITION BY column1 ORDER BY column2 [ASC|DESC])
예제: 부서별 급여 순위
SELECT deptno, ename, sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank_in_dept
FROM emp;
결과 예시:
| deptno | ename | sal | rank_in_dept |
|---|---|---|---|
| 10 | KING | 5000 | 1 |
| 10 | CLARK | 2450 | 2 |
| 10 | MILLER | 1300 | 3 |
2. RANK vs DENSE_RANK vs ROW_NUMBER
| 함수 | 중복 값 처리 | 순위 GAP |
|---|---|---|
| RANK() | 같은 순위 부여 | O (순위 건너뜀) |
| DENSE_RANK() | 같은 순위 부여 | X (순위 연속) |
| ROW_NUMBER() | 모두 고유 순번 | X (순위 연속) |
예제 비교
SELECT ename, sal,
RANK() OVER (ORDER BY sal DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rnk,
ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_num
FROM emp;
3. PARTITION BY 활용
PARTITION BY는 그룹별로 순위를 나누고자 할 때 사용합니다. 예를 들어, 각 부서(deptno) 내에서 급여 순위를 매기고 싶다면 다음과 같이 작성합니다.
SELECT deptno, ename, sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS dept_rank
FROM emp;
4. 실전 예제
💼 예제 1: 월별 매출 상위 3개 제품
SELECT month, product_name, sales
FROM (
SELECT month, product_name, sales,
RANK() OVER (PARTITION BY month ORDER BY sales DESC) AS rank
FROM sales_data
)
WHERE rank <= 3;
💼 예제 2: 지역별 평균보다 높은 급여자 순위
SELECT region, ename, sal,
RANK() OVER (PARTITION BY region ORDER BY sal DESC) AS region_rank
FROM employees
WHERE sal > (
SELECT AVG(sal) FROM employees e2 WHERE e2.region = employees.region
);
5. 성능 팁 및 주의사항
- 인덱스 최적화: RANK의
ORDER BY에 사용하는 칼럼에 인덱스를 설정하면 성능이 향상됩니다. - RANK와 필터: 순위를 기준으로 조건을 걸 때는 서브쿼리로 감싸는 방식이 안전합니다.
💡 TIP: RANK는 동일한 순위가 존재하면 그 다음 순위가 건너뛰기 때문에 보고서용 데이터에서는
DENSE_RANK()가 더 자연스러울 수 있습니다.6. 참고 문헌 및 출처
- Oracle 공식 문서 - docs.oracle.com
- Oracle SQL 튜토리얼 - oracletutorial.com
- Stack Overflow: #oracle-rank
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] SUM() 함수 기본 문법부터 실무 활용 팁까지 (0) | 2025.05.31 |
|---|---|
| [ORACLE] ROW_NUMBER() 함수 완벽 가이드 : 순위 매기기 실전 예제로 배우기 (0) | 2025.05.31 |
| [ORACLE] DENSE_RANK() 함수 완전 정복 : 순위 함수 실전 예제로 배우기 (0) | 2025.05.31 |
| [ORACLE] PARTITION BY() 함수 설명과 실무 SQL 예제 모음 (0) | 2025.05.31 |
| [ORACLE] LISTAGG()로 컬럼 값을 한 줄에 나열하는 방법 (0) | 2025.05.31 |