Advanced SQL: Ranking
Advanced SQL: Ranking
Description
RANK, DENSE_RANK, ROW_NUMBER는 윈도우 함수로, 정렬 기준에 따라 각 행의 순위를 매길 때 사용한다. 세 함수의 핵심 차이는 동점 처리 방식이다.
ROW_NUMBER(): 중복 없이 고유한 순번 부여RANK(): 동점이면 같은 순위, 다음 순위는 건너뜀DENSE_RANK(): 동점이면 같은 순위, 다음 순위는 건너뛰지 않음
Syntax
순위 함수는 OVER() 안에서 계산 기준을 정한다. ORDER BY는 순위를 매길 기준 컬럼이고, PARTITION BY를 추가하면 그룹별로 순위를 따로 계산할 수 있다.
SELECT column_name,
ROW_NUMBER() OVER (ORDER BY column_name) AS row_num,
RANK() OVER (ORDER BY column_name) AS rank_num,
DENSE_RANK() OVER (ORDER BY column_name) AS dense_rank_num
FROM table_name;
Example
ROW_NUMBER
매출 금액 기준으로 고유 번호를 부여한다.
SELECT order_id,
amount,
ROW_NUMBER() OVER (ORDER BY amount DESC) AS row_num
FROM orders;
RANK
매출 금액 기준으로 순위를 부여한다.
SELECT order_id,
amount,
RANK() OVER (ORDER BY amount DESC) AS rank_num
FROM orders;
DENSE_RANK
매출 금액 기준으로 순위를 부여한다.
SELECT order_id,
amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank_num
FROM orders;
Partitioned Ranking
부서별 급여 순위를 계산한다.
SELECT employee_id,
department,
salary,
RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS dept_rank
FROM employees;
Reference
This post is licensed under CC BY 4.0 by the author.