[Oracle] 집계함수와 WITHIN GROUP( ) 문 사용법
WITHIN GROUP( )는 OVER()와 함께 SQL에서 윈도우 함수를 사용할 때 사용되는 절입니다. OVER( )와 WITHIN GROUP( )의 특징은 아래와 같습니다.
- OVER( )는 윈도우 함수의 파티션 및 정렬을 지정하는 데 사용됩니다. 윈도우 함수는 결과 집합 내에서 데이터의 부분 집합에 대해 계산을 수행하고, OVER( ) 절은 이러한 부분 집합을 정의합니다. 예를 들어, SUM()이나 AVG()와 같은 집계 함수를 사용하여 파티션 내에서 합계 또는 평균을 계산할 때 유용합니다.
- WITHIN GROUP( )은 LISTAGG( )와 같은 일부 집계 함수에서 사용됩니다. 이 절은 집계 함수가 그룹 내에서 데이터를 결합하는 순서를 명시합니다. 즉, 결과를 결합할 때 데이터를 어떻게 정렬할지 지정합니다.
함수명 | 목적 및 기능 |
---|---|
RANK( ) | 정렬된 결과 집합에서 각 행의 순위를 할당하며 동일한 값이 있을 경우에는 동일한 순위가 할당되며, 그 다음 순위는 건너뛰고 다음 순위가 할당됩니다. |
DENSE_RANK( ) | RANK와 유사하지만, 동일한 값이 있을 경우에도 순위를 중복 없이 순차적으로 할당하며 순위가 건너뛰지 않고 연속적으로 할당됩니다. |
LISTAGG( ) | 여러 행의 값을 그룹화하여 하나의 문자열로 결합하는데 사용됩니다. 이 함수는 주로 문자열 연결(concatenation) 작업에 유용하게 사용됩니다. |
PERCENTILE_DISC( ) | 이산형(discrete) 백분위수를 계산하며, 순위를 기반으로 하여 결과 집합 내에 존재하는 실제 값 중 가장 가까운 순위에 있는 값을 반환합니다. |
PERCENTILE_CONT( ) | 연속형(continuous) 백분위수를 계산하며, 선형 보간(linear interpolation)을 사용하여 결과 집합 내에서 값들 사이의 추정된 값을 반환합니다. |
OVER( ) 문 사용법 글에서 사용한 데이터를 사용하여 각 함수들의 사용법 및 결과값을 알아보겠습니다.
RANK( ), PERCENT_RANK( ) 쿼리 결과
SELECT RANK(68000) WITHIN GROUP (ORDER BY SALARY) AS RANK , PERCENT_RANK(68000) WITHIN GROUP (ORDER BY SALARY) AS PERCENT_RANK FROM EMPLOYEE_TAB ;![]()
LISTAGG( ) 쿼리 결과
SELECT DEPARTMENT , LISTAGG(EMPLOYEE_NAME, ', ') WITHIN GROUP (ORDER BY HIRE_DATE) AS LISTAGG FROM EMPLOYEE_TAB GROUP BY DEPARTMENT;![]()
PERCENTILE_DISC( ), PERCENTILE_CONT( ) 쿼리 결과
SELECT DEPARTMENT , LISTAGG(SALARY, ', ') WITHIN GROUP (ORDER BY SALARY) AS LISTAGG , PERCENTILE_DISC(0.25) WITHIN GROUP (ORDER BY SALARY) AS PERCENTILE_DISC , PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY SALARY) AS PERCENTILE_CONT FROM EMPLOYEE_TAB GROUP BY DEPARTMENT;![]()