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>
'EPL과 유튜브 데이터로 배우는 DuckDB' 카테고리의 다른 글
| DuckDB + Python: SQL로 CSV 파일 다루기 part 1 (0) | 2026.06.20 |
|---|---|
| DuckDB + Python Part 2: SQL로 Parquet 파일과 다수의 CSV 파일 다루기 (0) | 2026.06.20 |
| 24~25 EPL 팀 중 홈에서 강한 팀 (0) | 2026.06.17 |
| 리버풀과 토트넘의 포지션별 공격 결과 (0) | 2026.06.17 |
| 리버풀과 토트넘의 공격 효율 비교 (0) | 2026.06.17 |
댓글