2과목 · SQL 기본 및 활용·15장
윈도우 함수
순위·집계·분석 윈도우 함수, PARTITION BY와 ORDER BY, ROWS/RANGE 프레임까지 정리합니다.
1. 윈도우 함수란
GROUP BY처럼 여러 행을 보지만 행을 합치지 않고 각 행 옆에 계산 결과를 붙이는 함수. 관계 분석·랭킹·누적 집계에 필수.
SELECT
name,
dept_id,
salary,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dept_rank
FROM emp;
OVER절이 윈도우를 정의.PARTITION BY: 그룹화 기준(그룹 내에서만 집계).ORDER BY: 윈도우 안에서의 순서.ROWS/RANGE: 현재 행 기준의 프레임.
2. 순위 함수
| 함수 | 동점 처리 | 번호 연속 |
|---|---|---|
RANK() |
동순위 허용 | 건너뜀 (1,1,3) |
DENSE_RANK() |
동순위 허용 | 연속 (1,1,2) |
ROW_NUMBER() |
동순위 임의 구분 | 항상 연속 (1,2,3) |
NTILE(n) |
n개 버킷으로 분할 | — |
SELECT
name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM emp;
3. 집계 윈도우 함수
SUM, AVG, MIN, MAX, COUNT 를 윈도우로 사용.
누적 합계
SELECT
ordered_at,
amount,
SUM(amount) OVER (ORDER BY ordered_at) AS cum_amount
FROM orders;
부서별 평균과의 비교
SELECT
name,
salary,
AVG(salary) OVER (PARTITION BY dept_id) AS dept_avg,
salary - AVG(salary) OVER (PARTITION BY dept_id) AS diff_from_avg
FROM emp;
4. 분석 함수 (Navigation)
| 함수 | 의미 |
|---|---|
LAG(col, n, def) |
n행 이전 값 |
LEAD(col, n, def) |
n행 이후 값 |
FIRST_VALUE(col) |
윈도우 내 첫 값 |
LAST_VALUE(col) |
윈도우 내 마지막 값 |
NTH_VALUE(col, n) |
n번째 값 |
-- 전월 대비 증감
SELECT
yyyymm, sales,
sales - LAG(sales) OVER (ORDER BY yyyymm) AS mom_diff
FROM monthly_sales;
5. 프레임 (ROWS / RANGE)
현재 행을 기준으로 어디부터 어디까지 집계할지.
SUM(amount) OVER (
ORDER BY ordered_at
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) -- 누적합
SUM(amount) OVER (
ORDER BY ordered_at
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) -- 최근 7행 이동합
AVG(price) OVER (
ORDER BY ordered_at
RANGE BETWEEN INTERVAL '3' DAY PRECEDING AND CURRENT ROW
) -- 최근 3일 평균
ROWS= 행 단위.RANGE= 값 단위(정렬 키의 범위).UNBOUNDED PRECEDING / FOLLOWING= 시작/끝까지.
기본 프레임
ORDER BY가 있을 때 기본 프레임은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. LAST_VALUE처럼 "끝까지" 보려면 프레임을 명시해야 기대대로 동작.
-- 부서의 최고 급여
LAST_VALUE(salary) OVER (
PARTITION BY dept_id ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
6. PARTITION BY와 ORDER BY의 조합
PARTITION BY만: 그룹 내 전체에서 집계.ORDER BY만: 단일 윈도우(전체)에서 순서.- 둘 다: 그룹 내에서 순서별 집계(누적 등).
- 둘 다 없음: 전체 행에 대한 하나의 윈도우.
7. 자주 출제되는 포인트
RANKvsDENSE_RANKvsROW_NUMBER의 동순위 처리.SUM(... ORDER BY ...) OVER ()는 누적 합 (RANGE 기본).LAG/LEAD로 전/후 값을 같은 행에서 참조.LAST_VALUE는 기본 프레임으로 "현재까지"만 보므로 프레임 확장 필요.ROWS는 행 단위,RANGE는 값 단위.
8. 요약 체크리스트
- 순위 3함수의 동순위 처리 차이를 답할 수 있다.
- PARTITION BY와 ORDER BY의 조합별 결과를 예로 설명할 수 있다.
- LAG/LEAD로 전월 대비 증감을 계산할 수 있다.
- ROWS와 RANGE 프레임의 차이를 설명할 수 있다.