ROW_NUMBER, RANK, 그리고 DENSE_RANK는 모두 각 객체의 순위를 표현하는데 나타내는 함수이다. 예를들어, 아래와 같이 학생과 학생의 성적이 담긴 테이블이 있다고 하자. 우리는 여기서 학생들의 순위를 알고 싶다.
NAME | SCORE |
일동준 | 97 |
이동준 | 76 |
삼동준 | 37 |
사동준 | 99 |
오동준 | 88 |
그럴때는 아래와 같이 쿼리를 작성한다. 각 함수를 써주고, OVER(ORDER BY 정렬기준)을 입력하면 기준에 맞게 정렬된 결과를 출력해준다 (정렬기준 뒤에 DESC를 기입하면 내림차순 기준으로 순위를 매긴다).
SELECT name, score,
ROW_NUMBER() OVER(ORDER BY score DESC) seq
FROM students
SELECT name, score,
RANK() OVER(ORDER BY score DESC) seq
FROM students
SELECT name, score,
DENSE_RANK() OVER(ORDER BY score DESC) seq
FROM students
name | score | seq |
사동준 | 99 | 1 |
일동준 | 97 | 2 |
오동준 | 88 | 3 |
이동준 | 76 | 4 |
삼동준 | 37 | 5 |
그러면 위와 같은 출력결과를 내준다. 주어진 상황에서는 세 순위함수 모두 같은 결과를 도출해준다. 이는 중복되는 점수값이 없기 때문이다. 만약 중복값이 존재하게 된다면 세 순위 집계함수는 중복값을 다르게 처리한다. 아래에서 중복값이 존재하는 예시를 살펴보자.
1) ROW_NUMBER
ROW_NUMBER은 중복 순위를 무시한다. 정렬 기준값에 중복값이 있더라도, 그냥 순차적으로 순위를 매긴다.
2) RANK
RANK는 같은 값에 중복 순위를 메긴다. 만약, 중복 순위가 존재한다면 그 다음 순위는 이전의 중복 순위를 고려해서 순위가 메겨진다. 예를들어 시험을 가장 잘본사람의 점수가 98점이고, 그 점수를 받은 사람이 2명이라면 1등은 2명이다. 이 경우에 2등은 존재하지않게 되며, 다음 순위는 3등부터 카운트한다.
3) DENSE_RANK
중복 순위를 고려한다는점은 RANK와 동일하다. 그러나 다음 순위를 메길때, 이전의 중복 순위는 고려하지 않는다. 1등이 10명이 존재하더라도, 다음 순위는 2등이다. 함수명대로, 순위를 밀도있게 채워 넣는다고 생각하면 되겠다.
아래 테이블을 기준으로, 세가지 함수를 모두 사용한다고 가정해보자.
NAME | SCORE |
가 | 100 |
나 | 100 |
다 | 80 |
라 | 70 |
ROW_NUMBER
중복순위를 고려하지 않으며, 차례대로 순위를 매긴다.
NAME | SCORE | seq |
가 | 100 | 1 |
나 | 100 | 2 |
다 | 80 | 3 |
라 | 70 | 4 |
RANK
중복순위를 허용하며, 다음 순위는 중복순위를 고려해 다음 순위를 메긴다.
NAME | SCORE | seq |
가 | 100 | 1 |
나 | 100 | 1 |
다 | 80 | 3 |
라 | 70 | 4 |
DENSE_RANK
중복 순위를 허용하며, 중복순위는 다음번의 순위 부여에 영향을 미치지 않는다.
NAME | SCORE | seq |
가 | 100 | 1 |
나 | 100 | 1 |
다 | 80 | 2 |
라 | 70 | 3 |
'sql' 카테고리의 다른 글
[SQL][HackerRank] Binary Tree Nodes (0) | 2023.01.02 |
---|---|
[SQL][HackerRank] Occupations (0) | 2022.12.27 |
[SQL] NESTED CASE (0) | 2022.12.26 |
[SQL] COUNT()와 NULL (0) | 2022.12.24 |
[SQL] 조건에 맞는 숫자 탐색 (0) | 2022.12.24 |