본문 바로가기
ORACLE

[ORACLE] ROW_NUMBER() 함수 완벽 가이드 : 순위 매기기 실전 예제로 배우기

by Dev. Orion 2025. 5. 31.
728x90

오라클 ROW_NUMBER() 함수 완벽 가이드: 순위 매기기 실전 예제로 배우기
[ ORACLE ] ROW_NUMBER()

1. ROW_NUMBER란?

ROW_NUMBER 함수는 Oracle SQL의 분석 함수 중 하나로, 지정된 정렬 기준에 따라 고유한 일련번호를 부여합니다. 동일한 값이 있어도 무조건 고유한 순번이 부여된다는 점이 특징입니다.

📌 기본 문법

ROW_NUMBER() OVER (PARTITION BY 컬럼명 ORDER BY 컬럼명 [ASC|DESC])

2. ROW_NUMBER 사용 이유

  • 각 그룹 내 첫 번째 항목 추출
  • 중복 제거 및 유일한 순번 지정
  • 페이지네이션 처리 (페이징 쿼리)
  • 최신 기록 또는 이전 기록 하나만 선택

3. 기본 예제

예제: 직원 급여 순번 부여

SELECT ename, sal,
       ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_num
  FROM emp;

결과 예시

ename sal row_num
KING 5000 1
BLAKE 2850 2
CLARK 2450 3

4. PARTITION BY와 결합

PARTITION BY는 그룹 내에서 독립적인 순번을 부여할 수 있도록 합니다.

예제: 부서별 급여 순번

SELECT deptno, ename, sal,
       ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS dept_row_num
  FROM emp;

5. 중복 제거 또는 그룹 내 1등만 선택

예제: 고객별 최근 주문 1건만 선택

SELECT * FROM (
  SELECT customer_id, order_date, product,
         ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
    FROM orders
)
WHERE rn = 1;

이 쿼리는 고객별로 가장 최근 주문 한 건만 추출합니다.

6. 페이지네이션 처리

예제: 11~20번째 행 추출

SELECT * FROM (
  SELECT t.*, ROW_NUMBER() OVER (ORDER BY created_at DESC) AS rn
    FROM posts t
)
WHERE rn BETWEEN 11 AND 20;

7. ROW_NUMBER vs RANK vs DENSE_RANK

함수 중복 순위 처리 순위 건너뜀 여부
ROW_NUMBER() 고유 순번 없음
RANK() 동일 값 동일 순위 있음
DENSE_RANK() 동일 값 동일 순위 없음

8. 성능 팁 및 주의사항

  • 정렬 대상 칼럼에 인덱스가 있으면 성능 향상
  • ROW_NUMBER()는 항상 고유한 값 → 중복제거에 유리
  • 서브쿼리 없이 WHERE 절에서 ROW_NUMBER 직접 필터링은 불가능
💡 TIP: 가장 최근의 데이터, 상위 1건 추출 등 정렬과 순번이 필요한 거의 모든 SQL에서 ROW_NUMBER()는 핵심 함수입니다.

9. 실무 활용 분야

  • 고객별 최신 주문, 거래 기록
  • 로그 데이터 분석 및 필터링
  • 상위 N개 추출 (Top-N)
  • 웹 페이지 리스트 페이징 처리

10. 참고 문헌 및 출처

728x90