DENSE_RANK() 함수는 SQL에서 순위를 매길 때 중복 값을 동일 순위로 처리하면서 다음 순위를 건너뛰지 않는 함수입니다.
예시>
점수: 100 90 90 80
순위: 1 2 2 3 ← dense_rank()
SELECT
컬럼1,
컬럼2,
DENSE_RANK() OVER (ORDER BY 정렬기준컬럼 [ASC|DESC]) AS 순위
FROM
테이블명;
| id | name | score |
| 1 | Alice | 90 |
| 2 | Bob | 95 |
| 3 | Carol | 90 |
| 4 | David | 85 |
| 5 | Emma | 80 |
SELECT
name,
score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM
students;
| name | score | rank |
| Bob | 95 | 1 |
| Alice | 90 | 2 |
| Carol | 90 | 2 |
| David | 85 | 3 |
| Emma | 80 | 4 |
| 함수 | 설명 |
| DENSE_RANK() | 중복 값은 같은 순위 + 다음 순위 건너뛰지 않음 |
| RANK() | 중복 값은 같은 순위 + 다음 순위 건너뜀 |
| ROW_NUMBER() | 무조건 순번 부여 (중복 무시) |
PARTITION BY는 DENSE_RANK(), RANK(), ROW_NUMBER() 같은 윈도우 함수에서 자주 사용되며, 데이터를 그룹별로 나눠서 순위를 매길 때 사용합니다.
SELECT
...,
DENSE_RANK() OVER (PARTITION BY 그룹기준컬럼 ORDER BY 정렬기준컬럼 DESC) AS 순위
FROM
테이블명;
| id | name | department | sales |
| 1 | Alice | HR | 200 |
| 2 | Bob | HR | 180 |
| 3 | Carol | HR | 200 |
| 4 | David | Sales | 300 |
| 5 | Emma | Sales | 250 |
| 6 | Frank | Sales | 300 |
SELECT
name,
department,
sales,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY sales DESC
) AS rank_in_department
FROM
employees;
| name | department | sale | rank_in_department |
| Alice | HR | 200 | 1 |
| Carol | HR | 200 | 1 |
| Bob | HR | 180 | 2 |
| David | Sales | 300 | 1 |
| Frank | Sales | 300 | 1 |
| Emma | Sales | 250 | 2 |
| 구성 | 요소의미 |
| PARTITION BY | 그룹을 나눌 기준 (ex: 부서별, 월별 등) |
| ORDER BY | 그룹 내 정렬 기준 (ex: 점수, 매출 등) |
| DENSE_RANK() | 중복 순위 부여 + 다음 순위 건너뛰지 않음 |
| 데이터베이스 테이블 인덱스 생성을 위해 효율적인 기준은? (0) | 2025.07.20 |
|---|---|
| sql 쿼리에서 current_timestamp 기능이란? (1) | 2025.07.19 |
| SQL 쿼리 날짜 차이 구하기 datediff 사용하는 방법 (0) | 2025.07.14 |
| 큐브리드 쿼리 플랜에서 비용 수치를 낮추는 방법은? (0) | 2025.06.24 |
| sqlite 에서 rank 함수같은 역할은? 요일별로 상위 3개 조회하기 (0) | 2025.06.24 |