윈도우 함수중급
ROW_NUMBER
윈도우 내 각 행에 고유한 일련번호(1, 2, 3, …)를 부여
정의
PARTITION BY로 나뉜 윈도우 안에서 ORDER BY 기준으로 1부터 시작하는 고유 번호를 매긴다. 동일 값이 있어도 같은 번호를 주지 않는다(타이브레이커가 필요하면 ORDER BY에 추가 컬럼). 페이지네이션, "그룹별 1등 추출" 등에 핵심적으로 쓰인다.
왜 중요한가?
틀리기 쉬운 포인트
- !WHERE 절에서 직접 ROW_NUMBER를 쓸 수 없습니다. 인라인 뷰로 감싸야 합니다.
- !ROW_NUMBER, RANK, DENSE_RANK는 동일 값 처리 방식이 다릅니다.
- !ORDER BY를 빼먹으면 결과가 비결정적입니다.
예시
-- 부서별 연봉 1위 SELECT * FROM ( SELECT e.*, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn FROM employees e ) WHERE rn = 1;
성능 포인트
!PARTITION BY/ORDER BY 컬럼이 인덱스의 선두와 일치하면 정렬 비용이 줄어든다(WINDOW NOSORT).