그룹 함수와 윈도우 함수
ROLLUP, CUBE, GROUPING SETS와 RANK, DENSE_RANK, ROW_NUMBER 같은 윈도우 함수를 결과 모양 중심으로 익힙니다.
ROLLUPCUBERANKOVER GROUP BY 다음 단계
일반 GROUP BY는 지정한 컬럼 조합별로 한 번만 집계합니다.
SELECT deptno, job, SUM(sal) AS sal_sum
FROM emp
GROUP BY deptno, job;
그룹 함수는 여기서 더 나아가 소계와 총계를 함께 만듭니다. 시험에서는 ROLLUP, CUBE, GROUPING SETS가 각각 어떤 집계 행을 추가하는지 묻습니다.
ROLLUP
ROLLUP(a, b)는 (a, b) 상세 집계, a 기준 소계, 전체 총계를 만듭니다.
SELECT deptno, job, SUM(sal) AS sal_sum
FROM emp
GROUP BY ROLLUP(deptno, job);
순서가 중요합니다. ROLLUP(deptno, job)은 부서별 직무 합계와 부서 소계를 만들지만, 직무별 소계만 따로 만들지는 않습니다.
CUBE
CUBE(a, b)는 가능한 모든 조합의 집계를 만듭니다.
SELECT deptno, job, SUM(sal) AS sal_sum
FROM emp
GROUP BY CUBE(deptno, job);
CUBE(deptno, job)은 (deptno, job), deptno, job, 전체 총계를 모두 만듭니다. 결과가 풍부한 대신 집계해야 할 조합이 많아집니다.
GROUPING SETS
GROUPING SETS는 필요한 집계 조합만 직접 고릅니다.
SELECT deptno, job, SUM(sal) AS sal_sum
FROM emp
GROUP BY GROUPING SETS ((deptno), (job));
위 쿼리는 부서별 합계와 직무별 합계만 만듭니다. (deptno, job) 상세 집계와 전체 총계는 만들지 않습니다.
세 그룹 함수 비교
| 함수 | 결과 성격 | 기억법 |
|---|---|---|
ROLLUP | 계층형 소계 | 위에서 아래로 말아 올립니다 |
CUBE | 모든 조합 집계 | 가능한 면을 전부 봅니다 |
GROUPING SETS | 지정한 조합만 집계 | 필요한 세트만 고릅니다 |
윈도우 함수란
윈도우 함수는 행을 없애지 않고, 각 행 옆에 순위나 누적값 같은 분석 결과를 붙입니다.
SELECT ename,
deptno,
sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS dept_rank
FROM emp;
GROUP BY는 여러 행을 한 행으로 줄이지만, 윈도우 함수는 원래 행을 유지합니다. 이 차이가 가장 중요합니다.
GROUP BY 집계
- 행 수가 줄어듭니다 (부서별 1행).
- 개별 사원 정보는 사라집니다.
- 결과:
deptno, SUM(sal)
윈도우 함수
- 행 수가 유지됩니다 (사원 14행 그대로).
- 각 행 옆에 집계·순위가 붙습니다.
- 결과:
ename, sal, RANK() OVER (...)
OVER 절 읽기
윈도우함수() OVER (
PARTITION BY 그룹기준
ORDER BY 정렬기준
)
PARTITION BY는 계산을 나눌 그룹입니다.ORDER BY는 그룹 안에서 순서를 정합니다.- 둘 다 생략할 수도 있지만, 순위 함수는 보통 정렬 기준이 필요합니다.
순위 함수 3개
| 함수 | 동점 처리 | 결과 예 |
|---|---|---|
RANK | 동점 후 다음 순위를 건너뜀 | 1, 2, 2, 4 |
DENSE_RANK | 동점 후 다음 순위를 붙여 씀 | 1, 2, 2, 3 |
ROW_NUMBER | 동점이어도 고유 번호 부여 | 1, 2, 3, 4 |
동점이 있는 문제에서 RANK와 DENSE_RANK를 구분하는 문제가 자주 나옵니다. “빈 순위가 생기면 RANK, 빈 순위가 없으면 DENSE_RANK”로 기억해 두시면 도움이 됩니다.
순서·비율 함수
| 함수 | 용도 |
|---|---|
LAG | 이전 행 값 확인 |
LEAD | 다음 행 값 확인 |
FIRST_VALUE | 파티션 첫 값 확인 |
LAST_VALUE | 파티션 마지막 값 확인 |
NTILE(n) | 전체를 n개 구간으로 나눔 |
RATIO_TO_REPORT | 전체 합계 대비 비율 계산 |
시험장에서 구분하는 법
- 행 수가 줄어들면
GROUP BY집계 문제입니다. - 행 수가 유지되고 순위·누적·이전값이 붙으면 윈도우 함수 문제입니다.
- 소계와 총계가 함께 나오면
ROLLUP,CUBE,GROUPING SETS를 의심합니다. - 동점 순위의 빈 번호 여부로
RANK와DENSE_RANK를 구분합니다.
한 문장 요약
그룹 함수는 집계 행을 만들고, 윈도우 함수는 원래 행 옆에 분석 값을 붙입니다.