MYSQL에서 지원하는 윈도우함수 중 RANK(), DENSE_RANK(), ROW_NUMBER() 함수를 사용하여 순위를 쉽게 구할 수 있습니다. MYSQL 5 버전까지만 해도 순위를 구하기 위해서 사용자 정의 변수를 활용하여 복잡하게 쿼리를 구성했어야 했는데, 8 버전 이상부터는 위의 3가지 함수를 활용하여 쉽게 순위를 구할 수 있게 되었습니다. 그럼 각각의 함수가 어떤 특징을 가지는지 알아보겠습니다.
RANK / DENSE_RANK / ROW_NUMBER 함수 특징
▶ RANK()
RANK() 함수의 특징은 중복이 가능하며, 순위가 같은 행이 여러 행이 있을 경우 같은 순위의 수만큼 건너뛰고 다음 순위를 계산합니다.
▶ DENSE_RANK()
DENSE_RANK() 함수의 특징은 중복이 가능하며, 순위가 같은 행이 여러 행이 있을 경우에도 다음 순위는 같은 순위의 수만큼 건너뛰지 않고 순차적으로 다음 순위를 계산합니다.
▶ ROW_NUMBER()
ROW_NUMBER() 함수의 특징은 중복이 없고, 단순히 행번호를 순차적으로 계산합니다.
함수 | 특징 |
RANK() | 공동 순위만큼 건너뜀 (예시 : 1,2,2,4,5) |
DENSE_RANK() | 공동 순위만큼 건너뛰지 않음 (예시 : 1,2,2,3,4) |
ROW_NUMBER() | 중복 없는 순위 (예시 : 1,2,3,4,5) |
각 함수별 비교 예시
RANK(), DENSE_RANK(), ROW_NUMBER() 함수가 순위를 구하거나 번호를 붙일 때 사용되기 때문에 각각 비슷한 성격을 가지고 있습니다. 따라서 다음의 예시를 통하여 각 함수별로 실제 쿼리를 작성해 보겠습니다.
※ 순위 함수들은 문법적으로 순위함수() OVER(ORDER BY 필드)로 쿼리를 사용합니다.
- 쿼리
SELECT ID, NAME, DEPT, SALARY,
-- 순위 : 중복 O, 건너뛰기 O
RANK() OVER(ORDER BY SALARY) 'RANK',
-- 순위 : 중복 O, 건너뛰기 X
DENSE_RANK() OVER(ORDER BY SALARY) 'DENSE_RANK',
-- 순위 : 행번호
ROW_NUMBER() OVER(ORDER BY SALARY) 'ROW_NUMBER'
FROM SALARY
- 결과
그룹별 순위 - PARTITION BY
데이터의 순위를 구하다 보면 그룹을 지어 순위를 구해야 하는 경우도 생길 수 있습니다. 이럴 경우에는 OVER() 안에 PARTITION BY를 주어 그룹을 만들고 그 안에서 순위를 구할 수 있습니다.
- 쿼리
# 그룹 내 순위 구하기
SELECT ID, NAME, DEPT, SALARY,
RANK() OVER(PARTITION BY DEPT ORDER BY SALARY) 'RANK'
FROM SALARY
- 결과
'IT > MYSQL' 카테고리의 다른 글
MYSQL - ROLLUP 함수로 소계, 합계 한 번에 조회하기 (0) | 2023.02.26 |
---|---|
MYSQL - SUM, MAX, MIN, AVG, COUNT 집계함수 데이터 조회하기 (0) | 2023.02.25 |
MYSQL - 테이블 외래키(FOREIGN KEY) 추가, 삭제, 확인하기 (0) | 2023.02.23 |
MYSQL - 테이블 수정하기 ALTER TABLE (0) | 2023.02.20 |
MYSQL - 테이블 생성하기 CREATE TABLE (0) | 2023.02.19 |
댓글