ROWS와 RANGE 프레임 비교하기
행 기반 프레임과 값 기반 프레임의 미묘하고 자주 출제되는 차이를 알아봅니다.
ROWS와 RANGE 프레임 비교하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관들이 질문하는 차이점
누적 합계를 작성할 수 있게 되면 자연스럽게 다음과 같은 질문이 이어집니다: "윈도우 프레임에서 ROWS와 RANGE의 차이는 무엇인가요?" 이는 중급 수준의 역량을 정확히 보여 주는 신호입니다. 많은 지원자가 매일 프레임을 사용하면서도 두 키워드가 서로 다르게 작동한다는 점은 알아차리지 못합니다.
둘 다 집계 함수가 보는 행 집합을 정의하지만, 근본적으로 다른 방식으로 그 집합을 셉니다. 이 차이를 정확히 이해하면 눈에 띄는 지원자가 될 수 있습니다.
ROWS는 실제 행을 셉니다
ROWS는 위치를 기준으로 합니다. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW는 순서가 지정된 목록에서 현재 행과 그 바로 위에 있는 두 개의 실제 행을 말 그대로 의미합니다.
이웃한 행이 동일한 ORDER BY 값을 공유하는지는 고려하지 않습니다. 세 행이면 그저 세 행일 뿐입니다. 이동 평균과 엄격한 누적 합계에는 거의 항상 이 프레임 방식을 사용하고 싶을 것입니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS rows_sum
FROM sales;RANGE는 값으로 셉니다
RANGE는 값을 기준으로 합니다. 행의 개수가 아니라 현재 행의 값에서 논리적으로 정해진 범위 안에 들어오는 ORDER BY 값을 가진 모든 행을 포함합니다.
가장 중요한 결과는 다음과 같습니다. RANGE에서는 ORDER BY 값이 동일한 모든 행을 하나의 동률 그룹으로 취급합니다. 이들은 모두 동일한 프레임을 가지므로 결과도 동일합니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS range_sum
FROM sales;차이를 보여 주는 동률 예제
두 매출이 모두 2024-03-02에 발생했고 금액은 각각 30과 40이라고 가정해 보십시오. 그 전날인 2024-03-01의 매출 금액은 100입니다.
- RANGE에서 CURRENT ROW까지: 두 03-02 행은 동률이므로 모두 100 + 30 + 40 = 170을 표시합니다.
- ROWS에서 CURRENT ROW까지: 첫 번째 03-02 행은 130을, 두 번째 행은 170을 표시합니다. 각 행이 한 위치씩 프레임을 확장하기 때문입니다.
데이터는 같지만 숫자는 다릅니다. 동률일 때 나타나는 이 차이가 바로 이 질문의 핵심입니다.
기본값이 RANGE인 이유
OVER (ORDER BY ...)에 명시적인 프레임이 없으면 기본값이 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW라는 점을 기억하십시오.
따라서 단순한 누적 합계는 묵시적으로 RANGE를 사용합니다. 정렬 키가 고유하면 ROWS와 동일하므로 문제가 드러나지 않습니다. 정렬 값이 중복되는 순간 누적 합계가 동률인 행들을 조용히 하나로 묶습니다. 숙련된 엔지니어가 ROWS를 명시적으로 작성하는 이유가 바로 이것입니다.
숫자 오프셋을 사용하는 RANGE
RANGE는 UNBOUNDED뿐 아니라 값 오프셋도 사용할 수 있습니다. 날짜 또는 숫자 열에 RANGE BETWEEN 7 PRECEDING AND CURRENT ROW를 적용하면 현재 값에서 7단위 이내인 모든 행이 포함됩니다.
날짜에 적용하면 누락된 날짜를 올바르게 건너뛰는 진정한 "최근 7일" 윈도우가 됩니다. 반면 ROWS 7 PRECEDING은 누락 여부와 관계없이 이전 행 7개를 가져옵니다. 이 미묘한 차이를 아는 것은 강력한 답변이 됩니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
) AS last_7_days
FROM sales;ROWS는 간격을 무시합니다
반대 측면도 있습니다. ROWS는 데이터의 간격을 고려하지 않습니다. 매출 테이블에 주말이 빠져 있다면 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW는 기록된 날짜 7일을 포함하며, 실제로는 달력 기준 2주에 걸칠 수도 있습니다.
따라서 선택은 의도에 따라 달라집니다. 최근 N개 레코드를 의미한다면 ROWS를, 값의 최근 N단위(일, 달러)를 의미한다면 오프셋이 있는 RANGE를 사용합니다.
방언별 지원 현실 점검
솔직한 면접 답변이라면 지원 차이도 언급해야 합니다.
- PostgreSQL은 오프셋이 있는
RANGE를 v11부터 지원하며,ROWS는 완전히 지원합니다. - SQL Server는
ROWS와RANGE를 지원하지만,RANGE에서는 숫자 오프셋을 사용할 수 없고UNBOUNDED/CURRENT ROW만 사용할 수 있습니다. - MySQL 8은 둘 다 지원하지만,
RANGE오프셋의 유형에 제한이 있습니다.
숫자 RANGE 오프셋을 사용할 수 없다면 자체 조인이나 생성한 달력을 사용해 같은 결과를 구현할 수 있습니다. 이를 언급하면 실무 감각을 보여 줄 수 있습니다.
GROUPS: 세 번째 방식
잘 알려지지 않은 세 번째 프레임 방식으로 GROUPS가 있습니다. 이는 행이나 값이 아니라 동일 값 그룹의 개수를 셉니다. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW는 현재 동일 값 그룹과 바로 앞의 그룹을 포함합니다.
실제로 요구되는 경우는 드물지만, "다른 프레임 방식도 있나요?"라는 질문을 받았을 때 이를 언급하면 깊이 있는 이해를 보여 줄 수 있습니다. PostgreSQL 11 이상과 일부 다른 데이터베이스에서 지원됩니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS two_day_groups
FROM sales;외워서 말할 수 있는 판단 기준
이 주제 전체를 면접에서 말할 수 있는 한 문장으로 요약해 보겠습니다.
"고정된 수의 물리적 행을 의미할 때는 ROWS를 사용하고, 정렬 값의 논리적 범위를 의미할 때는 RANGE를 사용하며, 기본 RANGE가 동일한 값을 하나로 묶기 때문에 동률이 생기면 둘의 결과가 달라진다는 점을 기억하십시오."
이 한 문장으로 질문에 완전하고 자신 있게 답할 수 있습니다.
나란히 비교하기
두 프레임 방식을 하나의 쿼리에 넣으면 차이가 뚜렷하게 보입니다. 날짜가 중복된 데이터에 이 쿼리를 실행하고 두 열을 행별로 비교해 보십시오.
날짜가 모두 고유하면 두 열이 정확히 일치합니다. 날짜가 같은 행에서는 RANGE 열이 동일 값 그룹 전체에 같은 합계를 반복하는 반면, ROWS 열은 한 단계씩 증가합니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
SUM(amount) OVER (ORDER BY sale_date
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;빠른 확인
기본 프레임에서 두 행의 ORDER BY 값이 같다면 어떻게 됩니까?
복습: ROWS와 RANGE
ROWS는 물리적 행을 세고, RANGE는 정렬 열의 논리적 값을 기준으로 세며 같은 값을 동순위로 묶습니다. 기본 OVER (ORDER BY ...) 프레임은 RANGE이므로, 단순한 누적 합계에서는 중복된 정렬 값이 하나로 묶일 수 있습니다.
"최근 N개 레코드"와 간격에 영향을 받지 않는 이동 윈도우에는 ROWS를 선택하고, 간격을 반영하는 "최근 N일/달러"에는 오프셋이 있는 RANGE를 선택하십시오. GROUPS가 존재한다는 것을 알고 있으면 가산점이 됩니다. 다음에는 ROWS 프레임을 적용해 이동 평균을 만들어 보겠습니다.
자주 묻는 질문
“ROWS와 RANGE 프레임 비교하기” 강의는 무료인가요?
네 — “ROWS와 RANGE 프레임 비교하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“ROWS와 RANGE 프레임 비교하기”에서 뭘 배우나요?
행 기반 프레임과 값 기반 프레임의 미묘하고 자주 출제되는 차이를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“ROWS와 RANGE 프레임 비교하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 윈도 프레임으로 누적 합계 계산하기
- ROWS와 RANGE 프레임 비교하기
- 이동 윈도에서 이동 평균 계산하기
- 누적 분포와 전체 대비 비율