윈도우 함수 기초

집계값을 붙여도 원본 행은 그대로 남긴다

윈도우 함수는 현재 행을 기준으로 비교 묶음과 계산 범위를 정한 뒤, 그 결과를 새 컬럼처럼 붙인다. 그래서 “줄이는 집계”가 아니라 “행마다 해석을 덧붙이는 집계”로 읽어야 한다.

이전 행 프레임 포함 현재 행 다른 파티션 프레임 밖
원본 행 GROUP BY처럼 합쳐지지 않고 각 행이 남는다.
현재 행 계산의 기준점이며 결과가 붙는 자리다.
프레임 현재 행 주변에서 실제 집계에 쓰는 범위다.
원본 행 유지 PARTITION 묶음 현재 행 FRAME 범위
행 유지 GROUP BY처럼 줄이지 않고 각 행에 계산 결과를 덧붙인다.
기준 행 현재 행을 기준으로 앞뒤 어느 범위를 볼지 프레임이 정한다.
읽는 순서 PARTITION, ORDER BY, ROWS/RANGE를 분리해 결과 의미를 읽는다.

1. 원본 행

입력

`GROUP BY`라면 부서별 한 줄로 줄지만, 윈도우 함수는 네 행을 모두 유지한다.

사원 부서 매출
민준 개발 1월 940
서연 개발 2월 880
도윤 개발 3월 760
지우 영업 2월 910

2. OVER 설계

계산식
SUM(month_sales) OVER (
  PARTITION BY dept
  ORDER BY month
  ROWS BETWEEN UNBOUNDED PRECEDING
       AND CURRENT ROW
) AS running_dept_sales
PARTITION BY 현재 행과 같은 부서만 비교 묶음으로 남긴다.
ORDER BY 누적·순위처럼 순서가 필요한 계산의 기준을 정한다.
ROWS 정렬된 묶음 안에서 실제 계산에 들어갈 행을 자른다.

3. 결과 컬럼

출력

서연 행은 사라지지 않고, 같은 부서의 1월과 2월 매출을 더한 값만 옆에 붙는다.

사원 부서 매출 누적
민준 개발 1월 940 940
서연 개발 2월 880 1,820
도윤 개발 3월 760 2,580

서연 행에서 실제 계산 범위

프레임
민준 1월 같은 부서, 이전 행
서연 2월 현재 행 포함
도윤 3월 아직 프레임 밖
지우 2월 다른 파티션

같은 `OVER`라도 `ORDER BY`와 프레임을 빼거나 바꾸면 “부서 전체 합계”, “현재 행까지 누적”, “이동 평균”처럼 결과의 의미가 달라진다.

읽기 1

무엇을 붙이나

순위, 누적합, 평균, 이전 값처럼 새 컬럼이 될 값을 먼저 본다.

읽기 2

누구끼리 비교하나

`PARTITION BY`가 있으면 그 묶음 밖의 행은 계산에 섞지 않는다.

읽기 3

어디까지 계산하나

`ORDER BY`와 프레임이 현재 행 앞뒤의 계산 범위를 결정한다.

ROW_NUMBER()

동점이어도 한 줄씩 고유 번호를 붙인다. 페이지네이션에 적합하다.

RANK()

동점은 같은 순위, 다음 순위는 건너뛴다. 대회식 순위에 맞다.

DENSE_RANK()

동점은 같은 순위, 다음 순위는 이어진다. 등급 묶음에 맞다.