레코드를 특정 column의 값을 기준으로 정렬하여 순서를 매길 수 있다.
만약 아래와 같은 테이블이 있다고 가정하자
| USERID | SCORE |
|---|---|
| a | 10 |
| b | 30 |
| c | 50 |
| d | 90 |
| e | 80 |
| f | 50 |
| g | 20 |
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() 함수를 사용하면 아래와 같다
<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()의 결과는 점수가 같더라도 레코드가 달라지면 다른 순서를 매긴다.