프레임 선택

프레임 선택 기준

윈도우 함수의 프레임은 “몇 행을 볼 것인가”를 정하는 계약이다. 먼저 계산이 상대 행, 물리 행 수, 같은 정렬값 묶음, 정렬상 마지막 행 중 어디를 참조하는지 고르고 ORDER BY와 보조 정렬 키까지 SQL에 드러낸다.

r1 이전 행 프레임 밖
r2 이전 행 필요할 때만 포함
r3 ROWS 포함 물리 행 수 기준
현재 계산 기준 정렬 키로 고정
동점 A RANGE 포함 같은 정렬값
동점 B RANGE 포함 같은 정렬값
마지막 후보 경계 명시 필요
ROWS 보이는 행 개수를 고정해서 누적합과 이동 평균이 안정적이다.
RANGE 같은 정렬값의 peer 행이 한 번에 프레임으로 들어온다.
LAST_VALUE 끝 경계를 쓰지 않으면 현재 행을 마지막으로 읽기 쉽다.
ROWS 현재 행을 중심으로 물리적인 앞뒤 행 수를 고정한다.
RANGE 정렬값이 같은 peer 행은 같은 프레임에 함께 들어온다.
끝 경계 LAST_VALUE는 마지막 행 기준을 명시하지 않으면 오해하기 쉽다.
상대 위치 LAG, LEAD는 프레임보다 정렬 순서의 안정성이 먼저다.
행 개수 이동 평균과 누적합은 ROWS가 결과를 예측하기 쉽다.
동점 값 RANGE는 같은 정렬값을 묶어 한 번에 확장될 수 있다.
명시 습관 ORDER BY와 frame clause를 함께 읽어야 디버깅이 된다.
앞뒤 행 하나와 비교하는가 직전 주문, 다음 상태, 전월 대비처럼 상대 위치가 핵심이다.
LAG / LEAD 프레임보다 오프셋
동률 순서가 흔들리지 않도록 보조 정렬 키를 둔다.
정확히 몇 행을 누적하거나 움직이는가 누적합, 7행 이동 평균, 최근 N건 이상치 탐지.
ROWS 물리 행 수 고정
ROWS BETWEEN ...으로 창의 시작과 끝을 적는다.
같은 정렬값을 한 묶음으로 보아야 하는가 동일 점수, 동일 날짜, 동일 가격대의 동점 묶음.
RANGE 정렬값 범위 기준
동점 행이 많으면 누적값이 행마다 하나씩 늘지 않을 수 있다.
현재 행이 아니라 마지막 상태가 필요한가 LAST_VALUE로 파티션의 최종 이력을 함께 보여줄 때.
전체 프레임 UNBOUNDED FOLLOWING
기본 프레임이면 LAST_VALUE가 현재 행에서 멈출 수 있다.
동률값 예시

ORDER BY score: 10, 20, 20, 30

101행
202행
203행 동점
304행
ROWS
2행까지만
RANGE
score 20 동점 행까지

동률값이 있으면 RANGE는 같은 정렬값 행을 함께 포함한다. 행 단위 누적이 목적이면 ROWS가 더 읽기 쉽다.

LAST_VALUE 함정

기본 프레임은 “현재 행”에서 끝날 수 있다

기본
CURRENT ROW
의도
UNBOUNDED FOLLOWING

마지막 행을 참조하는 쿼리는 파티션 전체를 보도록 프레임 끝을 명시해야 리뷰어도 결과 의미를 바로 읽을 수 있다.

행 단위 누적

ROWS로 계산 창을 고정

SUM(total) OVER (
  ORDER BY total DESC, product_id
  ROWS BETWEEN UNBOUNDED PRECEDING
       AND CURRENT ROW
)
마지막 상태

LAST_VALUE에는 끝 경계를 명시

LAST_VALUE(status) OVER (
  PARTITION BY ticket_id
  ORDER BY changed_at, event_id
  ROWS BETWEEN UNBOUNDED PRECEDING
       AND UNBOUNDED FOLLOWING
)
1
동률 정렬값 있다면 보조 정렬 키와 RANGE 동점 묶음을 함께 확인한다.
2
행 수 계산 누적, 이동 평균, 이상치 탐지는 ROWS로 창 크기를 고정한다.
3
마지막 행 참조 정렬상 마지막 행을 보려면 끝 경계를 직접 적는다.