본문 바로가기
Database/Oracle

[ORACLE] RANK() OVER 함수로 그룹 별 순위 구하기 실습 가이드

by Papa Martino V 2025. 5. 31.
728x90

 

오라클 RANK() OVER 함수로 그룹 별 순위 구하기 실습 가이드
[ ORACLE ] RANK

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. 참고 문헌 및 출처

728x90