Rank Over
레코드를 특정 column의 값
을 기준으로 정렬하여 순서를 매길 수 있다.
만약 아래와 같은 테이블이 있다고 가정하자
USERID | SCORE |
---|---|
a | 10 |
b | 30 |
c | 50 |
d | 90 |
e | 80 |
f | 50 |
g | 20 |
Rank()
SCORE COLUMN을 기준으로 순서를 매기고 싶다면 다음과 같이 하면된다.
<sxh sql>
SELECT USERID, SCORE, RANK() OVER(ORDER BY SCORE DESC) RANK FROM TMP_TABLE;
</sxh>
USERID | SCORE | RANK |
---|---|---|
d | 90 | 1 |
e | 80 | 2 |
c | 50 | 3 |
f | 50 | 3 |
b | 30 | 4 |
g | 20 | 5 |
a | 10 | 6 |
ROW_NUMBER()
ROW_NUMBER() 함수를 사용하면 아래와 같다
<sxh sql>
SELECT USERID, SCORE, ROWNUMBER() OVER(ORDER BY SCORE DESC) RANK FROM TMPTABLE;
</sxh>
USERID | SCORE | RANK |
---|---|---|
d | 90 | 1 |
e | 80 | 2 |
c | 50 | 3 |
f | 50 | 4 |
b | 30 | 5 |
g | 20 | 6 |
a | 10 | 7 |
위의 RANK()와 ROW_NUMBER()의 차이는 결과를 자세히 보면 알 수 있다. RANK()의 결과는 3, 4번째 레코드의 점수가 50점으로 동일하기 때문에 때문에 같은 순서인 2번을 매겼다. 하지만 ROW_NUMBER()의 결과는 점수가 같더라도 레코드가 달라지면 다른 순서를 매긴다.