← 개념서태블릿/PC 버전
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 가 있으면 기본 프레임은 현재 행까지다. 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 프레임의 차이를 설명할 수 있다.