OVER() 구성

세 요소가 같은 함수의 의미를 바꾼다

윈도우 함수는 함수 이름보다 OVER 안의 조건을 먼저 읽어야 한다. PARTITION BY는 비교 묶음, ORDER BY는 묶음 안의 순서, 프레임은 현재 행에서 실제 계산할 폭을 정한다.

PARTITION 비교 묶음 ORDER 행 순서 FRAME 계산 폭 현재 행 결과

1. 원본 행

현재 행: 서연
사원 부서 급여 입사
민준 개발 7200 2021
서연 개발 6600 2022
도윤 개발 6100 2023
지우 영업 6900 2022

서연 행에 값을 붙인다고 해도 다른 행이 사라지지는 않는다. 다만 OVER 조건이 어떤 행을 참고할지 결정한다.

2. 절별 역할

SQL
AVG(salary) OVER (
  PARTITION BY department
  ORDER BY hired_at
  ROWS BETWEEN UNBOUNDED PRECEDING
       AND CURRENT ROW
) AS running_avg_salary
PARTITION BY department 개발 행만 남기고 영업 행은 다른 계산 묶음으로 보낸다.
ORDER BY hired_at 입사 연도 순서로 이전 행과 현재 행을 판단한다.
ROWS ... CURRENT ROW 개발 파티션 안에서 서연까지의 행만 평균에 넣는다.

3. 서연 행에서의 계산

범위

파티션 적용

민준, 서연, 도윤은 개발 파티션에 남고 지우는 제외된다.

정렬 적용

입사 연도 기준으로 민준 → 서연 → 도윤 순서가 된다.

프레임 적용

민준
7200
서연
6600
도윤
다음 행

서연의 누적 평균은 `(7200 + 6600) / 2 = 6900`이다.

PARTITION 생략

전체 결과가 한 묶음

부서를 나누지 않으므로 모든 행이 서로 비교 대상이 된다.

ORDER 생략

누적·순위 의미가 사라짐

집계는 파티션 전체 값이 되고 순위 함수는 기준이 모호해진다.

FRAME 생략

DB 기본 프레임을 확인

ORDER BY가 있으면 기본 프레임 때문에 누적처럼 보일 수 있다.

같은 AVG, SUM, RANK라도 OVER 안의 세 요소가 바뀌면 비교 대상과 계산 범위가 바뀐다. 윈도우 함수는 항상 함수명과 OVER 조건을 한 덩어리로 읽는다.