윈도우 함수중급

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 컬럼에 인덱스가 도움.

관련 개념

관련 카테고리