안녕하세요!
SQL 의 윈도우 함수 중 순위, 순서에 대한 내용입니다.
기본적으로 순서를 매기는 개념(ORDER BY)에 대해 설명한 후
글의 마지막에서 순서 정렬의 범위 지정(PARTITION BY)에 대해 설명합니다.
- 테이블 예시
첫번째 예시 테이블은 순서 개념을 위한 용도.
두번째 예시 테이블은 구분 개념을 추가 설명하기 위한 용도.
1. RANK
랭크 함수는 가장 기본적인 순서 정렬 함수입니다.
다만, 공동 순위가 발생할 시 그 후 순위에 대해서는 공동 순위의 개수만큼 건너뛰고 순서를 매깁니다.
SELECT 절에 아래와 같이 입력합니다.
ORDER BY 에서 정렬 기준 컬럼을 넣고 DESC 를 입력해주어야 내림차순으로 출력됩니다.
여기선 default인 오름차순 순서대로 작성했습니다.
SELECT RANK() OVER(PARTITION BY 구분 기준 컬럼 ORDER BY 정렬 기준 컬럼)
( RANK( ) OVER(ORDER BY 정렬 기준 컬럼) 만 사용한 예시. )
salary가 6000인 박김이, 박이김 두 명을 공동으로 3순위로 정렬하고 있습니다.
따라서 다음 순위는 공동 순위인 3에서 공동 순위의 개수인 2를 건너뛴 5순위로 매깁니다.
2. DENSE_RANK
DENSE_RANK 는 공동 순위가 발생하여도 본래의 순서대로 순위를 매깁니다.
SELECT 절에 아래와 같이 입력합니다.
ORDER BY 에서 정렬 기준 컬럼을 넣고 DESC 를 입력해주어야 내림차순으로 출력됩니다.
여기선 default인 오름차순 순서대로 작성했습니다.
SELECT DENSE_RANK() OVER(PARTITION BY 구분 기준 컬럼 ORDER BY 정렬 기준 컬럼)
( DENSE_RANK( ) OVER(ORDER BY 정렬 기준 컬럼) 만 사용한 예시. )
salary가 6000인 박김이, 박이김 두 명을 공동으로 3순위로 정렬하고 있습니다. RANK 함수와 동일합니다.
그러나 후 순위에 대해서 본래의 순서인 3 다음의 4로 순위를 매깁니다.
3. ROW_NUMBER
ROW_NUMBER 함수는 공동 순위를 따지지 않으며 모든 대상에 고유한 순서를 매깁니다.
SELECT 절에 아래와 같이 입력합니다.
ORDER BY 에서 정렬 기준 컬럼을 넣고 DESC 를 입력해주어야 내림차순으로 출력됩니다.
여기선 default인 오름차순 순서대로 작성했습니다.
SELECT ROW_NUMBER() OVER(PARTITION BY 구분 기준 컬럼 ORDER BY 정렬 기준 컬럼)
( ROW_NUMBER( ) OVER(ORDER BY 정렬 기준 컬럼) 만 사용한 예시. )
salary의 값에 대해 공동 순위를 적용하지 않고 고유한 순서를 매깁니다.
# 구분 개념 (PARTITION BY)
RANK, DENSE_RANK, ROW_NUMBER 모두 동일하게 작동합니다.
PARTITION BY 를 ORDER BY 앞에 추가하여 순서 정렬 시 구분의 기준이 될 컬럼을 지정합니다.
SELECT RANK() OVER(PARTITION BY dt ORDER BY total)
SELECT DENSE_RANK() OVER(PARTITION BY dt ORDER BY total)
SELECT ROW_NUMBER() OVER(PARTITION BY dt ORDER BY total)
어느 범위 안에서 순서를 매길 것인지 설정한다고 이해하면 되겠습니다.
각 함수의 OVER 절에 PARTITION BY 컬럼은 'dt' , ORDER BY 컬럼은 'total' 입니다.
dt 컬럼에서 2005-05-24 기준으로 total 컬럼의 value 를 기준으로 순위를 매깁니다.
2005-05-25 로 바뀌자 새로운 순서를 매기는 것을 볼 수 있습니다.
각 함수들의 특징을 이해하고 용도에 맞게 사용하면 되겠습니다.
아래 링크의 글에서 윈도우 함수를 더 알아볼 수 있습니다.
2022.04.28 - [배우기/SQL] - SQL_WINDOW FUNCTION(윈도우 함수)_집계(SUM/MIN/MAX..), 비집계(LAG, LEAD..)_MySQL
'배우기 > SQL' 카테고리의 다른 글
HackerRank - SQL Project Planning (서브쿼리, 윈도우함수)_MySQL (0) | 2022.05.01 |
---|---|
SQL_WINDOW FUNCTION(윈도우 함수)_집계(SUM/MIN/MAX..), 비집계(LAG, LEAD..)_MySQL (0) | 2022.04.28 |
HackerRank - New Companies (SELECT 절 서브쿼리)_MySQL (0) | 2022.04.24 |
SQL 조인(INNER / LEFT / RIGHT JOIN) 알아보기_MySQL (0) | 2022.04.24 |
HackerRank - Contest Leaderboard(조인, 서브쿼리)_MySQL (0) | 2022.04.21 |
댓글