윈도우 함수 ② 집계와 윈도우 절
쉽게 말하면
합계나 평균 같은 집계 함수도 OVER를 붙이면 줄을 줄이지 않고 각 줄 옆에 값을 붙여요. 통장 내역의 '잔액' 칸처럼 처음부터 그 줄까지 더한 누적 합계를 만들 수 있어요. 어디부터 어디까지 계산할지는 ROWS나 RANGE로 정해요.
시험용 정의
SUM, AVG, COUNT, MAX, MIN 같은 집계 함수도 OVER를 붙이면 윈도우 함수가 된다. 행을 줄이지 않고 각 행 옆에 집계값을 붙인다. OVER 안의 윈도우 절(ROWS 또는 RANGE BETWEEN 시작 AND 끝)로 계산 범위를 정한다. ORDER BY만 있고 윈도우 절이 없으면 기본은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(누적)다.
비유로 이해하기
통장 거래 내역의 '잔액' 칸이다. 거래(행)는 그대로 두고, 처음부터 그 거래까지 더한 값을 옆에 적는다. ROWS는 '거래 몇 건 전부터', RANGE는 '금액이 얼마 차이 나는 거래까지'로 범위를 잡는다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 윈도우 절 | OVER 안에서 계산할 행 범위를 정하는 부분. ROWS 또는 RANGE로 시작 |
| UNBOUNDED PRECEDING | 파티션의 첫 행 |
| CURRENT ROW | 현재 행 |
| UNBOUNDED FOLLOWING | 파티션의 마지막 행 |
| n PRECEDING / n FOLLOWING | 앞으로 n / 뒤로 n (ROWS면 행 수, RANGE면 값 차이) |
ROWS vs RANGE
| 구분 | 범위를 세는 기준 | 동점 처리 |
|---|---|---|
| ROWS | 물리적인 행 개수 | 동점이어도 한 행씩 따로 누적 |
| RANGE | ORDER BY 열의 값 | 같은 값(동점)은 한 덩어리로 함께 포함 |
자주 쓰는 모양
| 쓰는 법 | 뜻 |
|---|---|
| SUM(sal) OVER () | 전체 합계를 모든 행에 |
| SUM(sal) OVER (PARTITION BY deptno) | 부서 합계를 그 부서 행마다 |
| SUM(sal) OVER (ORDER BY sal) | 누적 합계 (기본 RANGE, 동점 함께) |
| … ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | 행 단위 누적 합계 |
| … ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING | 앞 행, 현재 행, 뒤 행 3개 (이동 합계·이동 평균) |
| … RANGE BETWEEN 100 PRECEDING AND 100 FOLLOWING | 현재 값 ±100 안에 드는 행들 |
| ROWS UNBOUNDED PRECEDING | BETWEEN 없이 시작만 쓰면 끝은 CURRENT ROW |
시험에 이렇게 나와요
- OVER에 ORDER BY만 있으면 누적, 없으면 전체 집계
- ROWS와 RANGE 결과 차이 (동점 행)
- 1 PRECEDING AND 1 FOLLOWING 같은 윈도우 절 결과값 계산
- 윈도우 함수는 행 수를 줄이지 않음 (GROUP BY와 비교)
- 파티션 첫 행·마지막 행에서 범위가 잘리는 것
출제 범위·공식 안내 기반
확인 문제
Q1. SUM(sal) OVER (ORDER BY sal)은 무엇을 계산할까요?
- 부서별 합계
- 전체 급여 합계 하나
- 바로 앞 행의 급여
- 정렬 순서대로 처음부터 현재 행까지의 누적 합계
정답 보기
4번 정렬 순서대로 처음부터 현재 행까지의 누적 합계
OVER 안에 ORDER BY가 있으면 기본 범위가 처음 행부터 현재 행까지라 누적 합계가 된다. ORDER BY가 없으면 전체 합계가 모든 행에 붙는다.
Q2. 급여가 (100, 200, 200, 300) 순일 때 SUM(sal) OVER (ORDER BY sal)의 세 번째 행 값은?
- 200
- 300
- 500
- 800
정답 보기
3번 500
기본 RANGE라 같은 값 200 두 행이 함께 들어가 100 + 200 + 200 = 500. 두 번째 행도 500.
Q3. 같은 데이터에서 SUM(sal) OVER (ORDER BY sal ROWS UNBOUNDED PRECEDING)의 두 번째 행 값은?
- 200
- 300
- 500
- 800
정답 보기
2번 300
ROWS는 행 단위라 100 + 200 = 300.
Q4. AVG(sal) OVER (ORDER BY sal ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)이 첫 행에서 평균 내는 행 수는?
- 전체
- 1
- 3
- 2
정답 보기
4번 2
첫 행은 앞 행이 없어 현재 행과 뒤 행 2개.
Q5. SUM(sal) OVER () 의 값은?
- 오류
- 모든 행에 같은 전체 합계
- 행마다 누적 합계
- 첫 행 값
정답 보기
2번 모든 행에 같은 전체 합계
PARTITION BY도 ORDER BY도 없으면 전체가 한 범위다.
Q6. 윈도우 함수와 GROUP BY 집계의 차이로 옳은 것은?
- 둘 다 행 수를 줄인다
- GROUP BY는 행마다 값을 보여 준다
- 윈도우 함수는 WHERE 절에 쓸 수 있다
- 윈도우 함수는 행 수를 줄이지 않는다
정답 보기
4번 윈도우 함수는 행 수를 줄이지 않는다
윈도우 함수는 원래 행마다 집계 값을 붙여 준다.
헷갈리기 쉬운 O·X
SUM(sal) OVER ()는 모든 행에 같은 전체 합계를 보여 준다.
정답 보기
O PARTITION BY·ORDER BY가 없으면 전체가 한 윈도우다.
OVER에 ORDER BY를 쓰고 윈도우 절을 생략하면 기본 범위는 ROWS이다.
정답 보기
X 기본은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
RANGE는 ORDER BY 값이 같은 행들을 함께 범위에 넣는다.
정답 보기
O 값 기준이라 동점이 한 덩어리가 된다.