← 개념서모바일 버전
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. 자주 출제되는 포인트

  • RANK vs DENSE_RANK vs ROW_NUMBER동순위 처리.
  • SUM(... ORDER BY ...) OVER ()누적 합 (RANGE 기본).
  • LAG/LEAD 로 전/후 값을 같은 행에서 참조.
  • LAST_VALUE는 기본 프레임으로 "현재까지"만 보므로 프레임 확장 필요.
  • ROWS는 행 단위, RANGE는 값 단위.

8. 요약 체크리스트

  • 순위 3함수의 동순위 처리 차이를 답할 수 있다.
  • PARTITION BY와 ORDER BY의 조합별 결과를 예로 설명할 수 있다.
  • LAG/LEAD로 전월 대비 증감을 계산할 수 있다.
  • ROWS와 RANGE 프레임의 차이를 설명할 수 있다.