윈도우 함수중급
RANK / DENSE_RANK
윈도우 내 순위. 동일 값 처리 방식이 다르다
정의
RANK는 동일 값에 같은 순위를 주고 다음 순위를 건너뛴다(1, 1, 3). DENSE_RANK는 건너뛰지 않는다(1, 1, 2). ROW_NUMBER는 동일 값에도 고유 번호를 준다(1, 2, 3). 세 함수의 차이를 명확히 알아야 의도한 결과가 나온다.
왜 중요한가?
"공동 1위가 있을 때 1, 1, 3으로 표현" 같은 비즈니스 규칙을 구현할 때 RANK가 정답. ROW_NUMBER로는 공동 순위를 표현할 수 없다.
틀리기 쉬운 포인트
- !RANK는 동일 값에 같은 순위, 다음을 건너뜁니다(1,1,3). DENSE_RANK는 안 건너뜁니다(1,1,2).
- !공동 순위 표현이 필요하면 ROW_NUMBER가 아닌 RANK/DENSE_RANK.
- !ORDER BY를 지정하지 않으면 순위 기준이 없어 오류.
예시
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rk, DENSE_RANK() OVER (ORDER BY salary DESC) AS drk FROM employees;
성능 포인트
!ROW_NUMBER와 동일한 비용 구조. PARTITION BY/ORDER BY 컬럼에 인덱스가 도움.