728x90
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. 참고 문헌 및 출처
- Oracle 공식 문서 - docs.oracle.com
- Oracle SQL 튜토리얼 - oracletutorial.com
- Stack Overflow - #oracle-row-number
728x90
'ORACLE' 카테고리의 다른 글
[ORACLE] AVG() 함수 완벽 정리 : 평균 계산의 모든 것 (0) | 2025.05.31 |
---|---|
[ORACLE] SUM() 함수 기본 문법부터 실무 활용 팁까지 (0) | 2025.05.31 |
[ORACLE] DENSE_RANK() 함수 완전 정복 : 순위 함수 실전 예제로 배우기 (0) | 2025.05.31 |
[ORACLE] PARTITION BY() 함수 설명과 실무 SQL 예제 모음 (0) | 2025.05.31 |
[ORACLE] RANK() OVER 함수로 그룹 별 순위 구하기 실습 가이드 (0) | 2025.05.31 |