본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
EPL과 유튜브 데이터로 배우는 DuckDB

SQL Window Function에서 ROWS와 RANGE

by 아참형인간 2026. 6. 19.

ROWS와 RANGE의 가장 큰 차이점은 SQL 윈도우 함수에서 ROWS는 데이터셋 내 행의 물리적인 위치를 기준으로 처리하는 반면, RANGE는 ORDER BY 컬럼의 값을 기준으로 논리적으로 처리한다는 점입니다. 이러한 동작 방식의 차이는 정렬 컬럼에 중복 값(동점)이 존재할 때 매우 분명하게 나타납니다.

 

  • ROWS: 행을 순서대로 하나씩 평가합니다. 인접한 행들이 동일한 값을 가지고 있는지는 전혀 고려하지 않습니다.
  • RANGE: 동일한 값을 가진 행들을 하나의 논리적 블록으로 평가합니다. 여러 행이 동일한 정렬 값을 가지고 있다면, RANGE는 이들을 같은 계산 프레임에 동시에 포함시킵니다.

입력 테이블

/*
ROWS와 RANGE 두 가지 프레임 방식을 사용하여
누적 합계(running total)를 계산해 보겠습니다.
*/

SELECT 
    sale_date,
    amount,

    -- 물리적인 행 기준 프레임
    SUM(amount) OVER (
        ORDER BY sale_date 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS rows_running_total,

    -- 논리적인 값 기준 프레임
    SUM(amount) OVER (
        ORDER BY sale_date 
        RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS range_running_total

FROM sales;

출력 테이블

 

  • ROWS 분석: 첫 번째 2026-06-10 행에서 ROWS는 시작 행부터 현재 행까지의 물리적인 위치만 확인합니다. 따라서 100 + 200 = 300을 계산합니다. 다음 행으로 이동하면 다음 물리적 행이 포함되어 300 + 300 = 600을 계산합니다. 이 방식은 부드럽게 증가하는 누적 계산을 만듭니다.
  • RANGE 분석: RANGE가 2026-06-10을 만나면 동일한 값이 존재하는지 확인합니다. 같은 날짜를 가진 모든 행을 찾아 즉시 윈도우 프레임에 포함시킵니다. 따라서 중복된 두 행 모두 (100 + 200 + 300 = 600) 전체 그룹을 한 번에 계산하게 되며, 동일한 누적 결과를 갖는 계단형(step) 계산 결과가 나타납니다.

<출처: https://medium.com/@ritusantra/row-vs-range-in-sql-window-function-a2632b171589>

댓글