[Oracle] RANK OVER, DENSE_RANK OVER, ROW_NUMBER OVER 로 순위를 조회하기

RANK () OVER ([ partition_clause ] order_by_clause)

RANK OVER, DENSE_RANK OVER, ROW_NUMBER OVER

partition으로 나누어, 정렬하여 순위를 매깁니다.(partition은 생략 가능합니다.)
동일한 순위는 같은 번호가 매겨집니다. 동점자만큼 다음 순위가 정해집니다.
위의 예시에서는 1등, 공동 2등 2명, 4등으로 3등이 존재하지 않습니다.

DENSE_RANK () OVER ([ partition_clause ] order_by_clause)

dense 가 밀집하다는 뜻이죠.
동일한 순위는 rank 와 마찬가지로 같은 번호가 매겨지며, 중복 순위가 있더라도 순서를 건너뛰지 않습니다.
위의 예시에서는 1등, 공동 2등 2명, 3등으로 순서가 생깁니다.

ROW_NUMBER () OVER ([ partition_clause ] order_by_clause)

row_number 는 rank 와 다르게 동일한 순위라도 번호가 겹치지 않습니다.
대신 결과조회단계에서 오라클 내부에서 정하는 순위가 정해집니다.

ROWNUM

결과 ORDER BY 이전에 정해진 내부순서가 정해집니다. ROW_NUMBER OVER 와 마찬가지로 겹치지 않습니다.

WITH TAB
     AS (SELECT 'LEE' NAME, 90 SCORE FROM DUAL
         UNION ALL
         SELECT 'CHOI' NAME, 60 SCORE FROM DUAL
         UNION ALL
         SELECT 'KIM' NAME, 80 SCORE FROM DUAL
         UNION ALL
         SELECT 'PARK' NAME, 80 SCORE FROM DUAL)
  SELECT TAB.*,
         RANK () OVER (ORDER BY SCORE DESC),
         DENSE_RANK () OVER (ORDER BY SCORE DESC),
         ROW_NUMBER () OVER (ORDER BY SCORE DESC),
         ROWNUM
    FROM TAB
ORDER BY SCORE DESC

댓글