티스토리 뷰
서론
값에 따라 순위를 정해야 할 때, SQL 내장 함수인 RANK를 사용하여 처리하는 방법을 소개합니다.
본론
RANK
RANK 함수는 OVER 절과 같이 사용하며 OVER 절의 조건에 따라 순위가 결정됩니다.
RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
OVER
OVER절에서 순위를 지정할 조건으로 PARTITION BY라는 옵션을 가집니다.
PARTITION BY
PARTITION BY
는 그룹별로 순위를 지정해야 할 때 사용합니다.
해당 절 뒤에 칼럼을 적으면 만들어진 그룹마다 순위가 부여됩니다.
ORDER BY
ORDER BY
는 말그대로 순위를 매기는 순서를 정의합니다. AGE 라는 컬럼을 기준으로 오름차순과 내림차순으로 순위를 매길 때는 아래 코드처럼 작성할 수 있습니다.
--내림차순 순위(큰 것이 1등)
RANK () OVER (ORDER BY age DESC)
--오름차순 순위(작은 것이 1등)
RANK () OVER (ORDER BY age ASC)
DENSE_RANK
사용이유
RANK의 결과에서 같은 값이 존재하는 경우에는 아래 예시처럼 바로 다음 수는 이전 값들의 개수만큼 순위가 차이가 나게 됩니다.
예시)
| score | rank |
| ----- | ---- |
| 4 | 1 |
| 4 | 1 |
| 3.85 | 3 | 2가 아니라 3이 되어버렸음.
| 3.65 | 4 |
| 3.65 | 4 |
| 3.5 | 6 |
DENSE_RANK를 사용하면 아래 예시처럼 고유값에 대해서만 순위가 매겨집니다. `
| score | rank |
| ----- | ---- |
| 4 | 1 |
| 4 | 1 |
| 3.85 | *2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.5 | *4 |
결론
RANK와 DENSE_RANK의 차이점에 대해서 알아보았습니다. 조합으로 이루어진 쿼리문이 익숙해지려면 아직 먼 이야기 같습니다.
참고: https://learn.microsoft.com/en-us/sql/t-sql/functions/dense-rank-transact-sql?view=sql-server-ver16
'개발자 > 데이터베이스(DB)' 카테고리의 다른 글
[SQL] Function 만들기 (0) | 2024.02.13 |
---|---|
[SQL] LEFT JOIN과 ON (0) | 2024.02.06 |
[SQL] GROUP BY와 HAVING (0) | 2024.02.06 |