한양과학기술고등학교

에듀테크 프로젝트 대시보드

윈도우 함수

OVER PARTITION BY row_number lag 누적합

집계처럼 여러 행을 보되 행을 합치지 않고 각 행 옆에 계산 결과를 붙입니다. 순위·누적·이동평균의 핵심.

1. 구조

함수() OVER (
    PARTITION BY 그룹컬럼      -- 생략 시 전체가 한 그룹
    ORDER BY 정렬컬럼
    ROWS BETWEEN 1 PRECEDING AND CURRENT ROW   -- 프레임(선택)
)

2. 순위 매기기

SELECT class_id, name, score,
  row_number() OVER w AS 순번,      -- 1,2,3,4 (동점도 임의 구분)
  rank()       OVER w AS 등수,      -- 1,2,2,4 (동점 후 건너뜀)
  dense_rank() OVER w AS 조밀등수,  -- 1,2,2,3
  ntile(4)     OVER w AS 사분위
FROM exams
WINDOW w AS (PARTITION BY class_id ORDER BY score DESC);

반복되는 OVER (...) 는 WINDOW 절로 한 번만 정의할 수 있습니다.

3. 앞뒤 행 참조

SELECT day, revenue,
  lag(revenue) OVER (ORDER BY day)              AS 전일,
  revenue - lag(revenue) OVER (ORDER BY day)    AS 증감,
  lead(revenue) OVER (ORDER BY day)             AS 익일
FROM daily_sales;

4. 누적·이동 집계

SELECT day, revenue,
  sum(revenue) OVER (ORDER BY day)                                   AS 누적합,
  avg(revenue) OVER (ORDER BY day ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS 이동평균7일,
  revenue::numeric / sum(revenue) OVER () * 100                      AS 비중_pct
FROM daily_sales
ORDER BY day;
"복원을 테스트하기 전까지 그것은 백업이 아니다"