[Oracle] RANK() OVER vs ROW_NUMBER() OVER

by 스뎅(thDeng) on

이전 블로그에서 옮겨온 포스트

레코드를 특정 column의 값을 기준으로 정렬하여 순서를 매길 수 있다. RANK() OVER 또는 ROW_NUMBER() OVER를 사용하면 된다. 간단히 아래와 같은 테이블을 생각하자.

SQL> SELECT * FROM TMP_TABLE;

USERID    |     SCORE
----------|----------
aaa       |        10
aaa       |        30
aaa       |        50
aaa       |        90
bbb       |        80
bbb       |        50
bbb       |        20
bbb       |        40
aaa       |        50

9 rows selected.

score column을 기준으로 순서를 매기고 싶다. 그러면 간단하게 다음과 같이 하면 되는데, RANK() OVERROW_NUMBER() OVER 둘의 순서값에 조금 차이가 있다.

SQL> SELECT
    USERID,
    SCORE,
    RANK() OVER (ORDER BY SCORE DESC) RANK
FROM TMP_TABLE;

USERID    |     SCORE|      RANK
----------|----------|----------
aaa       |        90|         1
bbb       |        80|         2
aaa       |        50|         3
aaa       |        50|         3
bbb       |        50|         3
bbb       |        40|         6
aaa       |        30|         7
bbb       |        20|         8
aaa       |        10|         9

9 rows selected.
SQL> SELECT USERID,
    SCORE,
    ROW_NUMBER() OVER (ORDER BY SCORE DESC) RANK
FROM TMP_TABLE;

USERID    |     SCORE|      RANK
----------|----------|----------
aaa       |        90|         1
bbb       |        80|         2
aaa       |        50|         3
aaa       |        50|         4
bbb       |        50|         5
bbb       |        40|         6
aaa       |        30|         7
bbb       |        20|         8
aaa       |        10|         9

9 rows selected.

위의 RANK()ROW_NUMBER()의 차이는 결과를 자세히 보면 알 수 있다. RANK()의 결과는 3, 4, 5번째 레코드의 점수가 50점으로 동일하기 때문에 때문에 같은 순서인 3번을 매겼다. 하지만 ROW_NUMBER()의 결과는 점수가 같더라도 레코드가 달라지면 다른 순서를 매긴다.

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License