본문 바로가기

Server/DB

순위함수 ROW_NUMBER(), RANK(), DENSE_RANK()

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