1. 순위함수
- ROW_NUMBER()
각 행에 고유한 순번을 부여한다.
동일한 값이라도 서로 다른 번호가 부여된다.
중복 없는 순차적 번호 부여가 필요할 때 사용 - RANK()
동일한 값에 대해 같은 순위를 부여하고, 다음 순위는 건너뛴다. (공동 1위가 2개면 다음 순위는 3위) - DENSE_RANK()
동일한 값에 대해 같은 순위를 부여하지만, 다음 순위를 건너뛰지 않는다. (공동 1위가 2개여도 다음 순위는 2위)
CREATE TABLE employee (
id INT,
name VARCHAR(50),
department VARCHAR(50),
salary INT
);
id | name | department | salary |
1 | 김철수 | 개발 | 5000 |
2 | 이영희 | 개발 | 5000 |
3 | 박지민 | 마케팅 | 4500 |
4 | 최다혜 | 마케팅 | 4800 |
5 | 정민준 | 개발 | 4800 |
6 | 한소희 | 인사 | 5200 |
2. 각 함수별 결과 비교
2.1 ROW_NUMBER()
SELECT
id,
name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employee;
6 | 한소희 | 인사 | 5200 | 1 |
1 | 김철수 | 개발 | 5000 | 2 |
2 | 이영희 | 개발 | 5000 | 3 |
4 | 최다혜 | 마케팅 | 4800 | 4 |
5 | 정민준 | 개발 | 4800 | 5 |
3 | 박지민 | 마케팅 | 4500 | 6 |
2.2 RANK()
SELECT
id,
name,
department,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_num
FROM employee;
6 | 한소희 | 인사 | 5200 | 1 |
1 | 김철수 | 개발 | 5000 | 2 |
2 | 이영희 | 개발 | 5000 | 2 |
4 | 최다혜 | 마케팅 | 4800 | 4 |
5 | 정민준 | 개발 | 4800 | 4 |
3 | 박지민 | 마케팅 | 4500 | 6 |
2.3 DENSE_RANK()
SELECT
id,
name,
department,
salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_num
FROM employee;
6 | 한소희 | 인사 | 5200 | 1 |
1 | 김철수 | 개발 | 5000 | 2 |
2 | 이영희 | 개발 | 5000 | 2 |
4 | 최다혜 | 마케팅 | 4800 | 3 |
5 | 정민준 | 개발 | 4800 | 3 |
3 | 박지민 | 마케팅 | 4500 | 4 |
3. 세 함수의 차이점 요약
함수 | 동일값 처리순위 | 건너뛰기 | 특징 |
ROW_NUMBER() | 순차적으로 다른 번호 부여 | 없음 | 항상 고유한 번호 부여 |
RANK() | 동일한 번호 부여 | 있음 | 공동 순위 후 건너뛰기 |
DENSE_RANK() | 동일한 번호 부여 | 없음 | 공동 순위 후 건너뛰지 않음 |
4. PARTITION BY와 함께 사용하기
PARTITION BY는 데이터를 특정 그룹(파티션)으로 나눈 후, 그 그룹 내에서 순위를 매기거나 번호를 부여할 때 사용
기본적으로 ROW_NUMBER(), RANK(), DENSE_RANK() 함수는 전체 데이터를 기준으로 정렬하여 순위를 부여함
하지만, 부서(department)별로 순위를 매기고 싶다면?
이때 PARTITION BY department를 사용하면 각 부서별로 별도의 순위가 매김
*ORDER BY 절은 필수지만, PARTITION BY는 선택사항이다.
SELECT
id,
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_num,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank_num
FROM employee;
1 | 김철수 | 개발 | 5000 | 1 | 1 | 1 |
2 | 이영희 | 개발 | 5000 | 2 | 1 | 1 |
5 | 정민준 | 개발 | 4800 | 3 | 3 | 2 |
4 | 최다혜 | 마케팅 | 4800 | 1 | 1 | 1 |
3 | 박지민 | 마케팅 | 4500 | 2 | 2 | 2 |
6 | 한소희 | 인사 | 5200 | 1 | 1 | 1 |
'Server > DB' 카테고리의 다른 글
재귀 CTE 정리 (코딩 테스트용) (0) | 2025.04.22 |
---|---|
SQL 서브쿼리의 종류와 특징 (0) | 2025.03.31 |
CASE, IF( ) (0) | 2025.03.30 |
WHERE VS GROUP BY (0) | 2025.03.30 |
입문반 커리큘럼, 혼자 정리해보기 - 소수점을 처리하는 함수 (0) | 2025.03.30 |