그룹 내 순위를 반환하는 함수 ROW_NUMBER OVER PARTITION BY
/* PARTITION BY, ORDER BY 절 모두 여러 개의 컬럼을 기준으로 설정할 수 있습니다. */
ROW_NUMBER() OVER(PARTITION BY [그룹핑할 컬럼] ORDER BY [정렬할 컬럼])
그룹 내 순위를 조회하는 함수 패턴인 'ROW_NUMBER OVER PARTITION BY'는 다음과 같은 문법으로 사용되는데요.
문법의 각 부분에 대해서 살펴보면 다음과 같습니다.
ROW_NUMBER()
먼저 'ROW_NUMBER()'는 윈도우 함수(ANSI/ISO SQL 표준 WINDOW FUNCTION) 중 순위를 반환하기 위해 사용되는 함수로 각 행에 고유한 번호를 부여합니다. (이때 번호는 1부터 시작하여 증가합니다.)
순위를 반환하기 위해 사용되는 다른 윈도우 함수인 'RANK()'와 'DENSE_RANK()'의 경우 동일한 값에 동일한 순위를 반환하는 반면, 'ROW_NUMBER()'의 경우 동일한 값이 있어도 순위는 중복되지 않는다는 특징이 있습니다.
OVER
'OVER'의 경우 윈도우 함수와 함께 사용되어 데이터 집합 내에서 계산이 수행될 범위를 정의합니다.
OVER 절 안에 'PARTITION BY' 절과 'ORDER BY' 절을 포함할 수 있습니다.
PARTITION BY
순위의 정렬 기준을 정하기 위한 'ORDER BY' 절이 필수인 반면, 'PARTITION BY' 절은 필수는 아니지만 해당 부분을 통해 데이터 집합의 데이터를 특정 기준에 따라 그룹으로 나눌 수 있습니다.
PARTITION BY를 지정하지 않으면 데이터 집합의 모든 행을 단일 그룹으로 취급하게 됩니다.
ORDER BY
'ORDER BY' 절의 경우 필수로 지정되어야 하며, 해당 절에 지정된 컬럼을 기준으로 각 그룹 내의 행들을 정렬하는 역할을 합니다.
***
정리하자면 해당 함수 패턴의 경우 'PARTITION BY' 절을 통해 데이터를 특정 기준에 따라 그룹으로 나누고 'ORDER BY' 절을 통해 각 그룹 내의 행들을 정렬하게 됩니다.
그리고 최종적으로 이렇게 그룹화 + 정렬된 데이터 집합에 대해 'ROW_NUMBER()' 함수를 사용하여 각 행의 고유한 순위를 매기는 것입니다.
사용 예시
첫 번째 예시는 'PARTITION BY' 절을 사용하지 않고 'ORDER BY' 절만 적용한 예시입니다.
ORDER BY에 적용된 'score' 컬럼을 기준, 내림차순(DESC)으로 정렬하여 순위를 매기게 됩니다.
두 번째 예시는 'ORDER BY' 절과 함께 'PARTITION BY' 절도 사용한 예시입니다.
PARTITION BY에 적용된 'subject_name' 컬럼을 기준으로 데이터를 그룹화하여 각 그룹에 대해 'score' 컬럼을 기준, 내림차순으로 정렬하여 순위를 매기게 됩니다.
세 번째 예시는 'PARTITION BY' 절에 여러 컬럼을 지정하는 경우의 예시입니다.
'subject_name' 컬럼과 'grade' 컬럼, 두 컬럼을 기준으로 하여 데이터를 그룹화 한 뒤, 각 그룹에 대해 'score' 컬럼을 기준으로 내림차순 정렬하여 순위를 매기게 됩니다.
(ORDER BY 절의 대상으로도 여러 컬럼을 지정할 수 있습니다.)
< 참고 자료 >
'Programming > Database' 카테고리의 다른 글
동일한 테이블을 여러 번 조인하는 방법과 서브쿼리를 사용하는 방법의 차이 (1) | 2024.10.09 |
---|---|
(SQLD) GROUPING SETS, ROLLUP, CUBE 내용 및 예시 정리 (0) | 2024.05.26 |
테이블 백업이나 분석에 사용되는 CTAS (CREATE TABLE AS SELECT) 쿼리 (0) | 2024.05.23 |
SQL SELECT 쿼리 실행 순서 및 처리 과정 정리 (0) | 2024.05.09 |
MySQL CTE란? (+ WITH RECURSIVE CTE) (0) | 2024.01.27 |