윈도 프레임으로 누적 합계 계산하기
정렬된 프레임에서 SUM OVER를 사용해 누적 합계를 만듭니다.
윈도 프레임으로 누적 합계 계산하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
누적 합계 질문
거의 모든 분석가 면접에는 다음과 같은 질문이 어떤 형태로든 포함됩니다: "시간에 따른 누적 수익을 보여 주세요." 누적 합계는 행마다 커지며 시작부터 현재 행까지의 모든 값을 누적하는 합계입니다.
윈도우 함수가 존재하기 전에는 지원자들이 느린 자기 조인이나 상관 서브쿼리로 이 문제를 해결했습니다. 현대적인 면접에서 기대하는 답변은 SUM(...) OVER (ORDER BY ...)입니다. 윈도우 프레임을 사용하는 방식까지 알면 2012년경 이후에 작성된 SQL을 이해한다는 신호가 됩니다.
정렬된 윈도우 합계의 구성
누적 합계는 집계 함수를 윈도우 함수로 바꾼 것뿐입니다. SUM(amount)은 그대로 두고 ORDER BY가 포함된 OVER 절을 추가합니다.
OVER 안의 ORDER BY가 누적 방식으로 만드는 요소입니다. SQL에 해당 순서로 행을 누적하라고 지시하기 때문입니다. ORDER BY가 없으면 SUM은 계속 증가하는 대신 모든 행에서 전체 파티션의 합계를 계산합니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
ORDER BY sale_date;ORDER BY가 프레임을 의미하는 이유
면접관들이 자세히 확인하기 좋아하는 부분이 있습니다. 윈도우 집계 함수에 ORDER BY를 추가하면 SQL은 기본 프레임으로 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW를 적용합니다.
이 기본값이 바로 누적 합계를 만드는 원리입니다. 파티션 시작부터 현재 행을 포함한 현재 행까지의 모든 행이 대상이 됩니다. 이 기본값을 이해하면 누적 합계가 "그냥 작동하는" 이유도 이해할 수 있습니다.
프레임 명시하기
프레임을 직접 작성할 수도 있습니다. 이 두 쿼리는 동일한 결과를 반환하지만, 명시적 버전은 내부에서 무슨 일이 일어나는지 알고 있음을 면접관에게 보여 줍니다.
누적 합계에는 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW를 명시하는 것이 가장 안전합니다. 실제 행을 세므로 RANGE에서 값이 묶일 때 생기는 예상 밖의 결과를 피할 수 있습니다(이는 다음 레슨에서 다룹니다).
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;예제: 일일 매출
월요일 100, 화요일 50, 수요일 200, 목요일 75의 4일간 매출을 생각해 보십시오. 누적 합계는 왼쪽에서 오른쪽으로 누적됩니다.
- 월요일: 100
- 화요일: 100 + 50 = 150
- 수요일: 150 + 200 = 350
- 목요일: 350 + 75 = 425
마지막 행은 항상 총합과 같습니다. 면접에서 언급할 수 있는 빠른 타당성 확인 방법입니다. 마지막 누적 합계 값은 전체 집합에 대한 SUM(amount)와 일치해야 합니다.
PARTITION BY로 그룹별 재설정
실제 문제에서는 전역 합계 하나가 아니라 고객별 또는 지역별 누적 합계를 원하는 경우가 많습니다. PARTITION BY를 추가하면 각 파티션의 시작에서 누적이 다시 시작됩니다.
다음과 같이 생각하면 됩니다. PARTITION BY는 행을 서로 독립적인 그룹으로 나누고, ORDER BY와 프레임은 각 그룹 안에서 별도로 적용됩니다.
SELECT
customer_id,
sale_date,
amount,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY sale_date
) AS customer_running_total
FROM sales;동률 처리 기준의 함정
두 행이 동일한 ORDER BY 값을 공유하면(같은 날짜에 발생한 두 매출처럼), 기본 RANGE 프레임은 이들을 동률 행으로 취급하여 두 금액을 모두 포함한 동일한 누적 합계를 부여합니다.
동률이어도 행 단위로 정확히 증가해야 한다면 ROWS 프레임으로 바꾸고 sale_date, id처럼 고유한 동률 해소 기준을 ORDER BY에 추가하십시오. 면접관들은 지원자가 이를 알아차리는지 확인하려고 일부러 중복 날짜를 넣기도 합니다.
SELECT
sale_date,
amount,
SUM(amount) OVER (
ORDER BY sale_date, id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;개수의 누적 합계
누적 계산은 SUM에만 한정되지 않습니다. 모든 집계 함수는 윈도우 함수로 사용할 수 있으므로 누적 개수, 누적 평균 또는 누적 최댓값을 만들 수 있습니다.
주문의 누적 개수는 대시보드에서 자주 사용하는 지표입니다. 각 날짜를 기준으로 지금까지 주문을 몇 건 받았는지를 보여 줍니다.
SELECT
order_date,
COUNT(*) OVER (
ORDER BY order_date
) AS orders_to_date
FROM orders;예전 방식: 상관 서브쿼리
면접관들은 깊이 있는 이해를 확인하기 위해 윈도우 함수 없이 누적 합계를 해결하라고 요청하기도 합니다. 윈도우 함수가 없던 시절의 전형적인 해결 방법은 이전의 모든 행을 다시 합산하는 상관 서브쿼리입니다.
이 방법은 작동하지만 O(n²)입니다. 각 행마다 테이블을 다시 훑기 때문입니다. 윈도우 함수가 이를 대체한 이유를 알고 있음을 보여 주려면 이 점을 언급하십시오.
SELECT
s.sale_date,
s.amount,
(SELECT SUM(s2.amount)
FROM sales s2
WHERE s2.sale_date <= s.sale_date) AS running_total
FROM sales s
ORDER BY s.sale_date;필터링과 윈도우 결과
자주 이어지는 질문은 다음과 같습니다. "누적 합계가 1000을 넘은 날만 보여 주세요." 프레임은 WHERE가 실행된 후에 계산되므로 윈도우 함수를 WHERE에 넣을 수는 없습니다.
해결 방법은 CTE나 서브쿼리에서 누적 합계를 계산한 다음 바깥 쿼리에서 필터링하는 것입니다. 이는 모든 윈도우 함수에 적용되는 동일한 감싸기 규칙입니다.
WITH t AS (
SELECT
sale_date,
SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
)
SELECT *
FROM t
WHERE running_total >= 1000;면접에서 강조할 내용
누적 합계 답변을 제시할 때 만점을 받으려면 다음 내용을 설명하십시오:
SUM OVER (ORDER BY ...)가 누적 형식입니다.ORDER BY를 추가하면UNBOUNDED PRECEDING부터CURRENT ROW까지를 범위로 하는 기본 프레임이 생성됩니다.- 그룹마다 다시 시작하려면
PARTITION BY를 사용하십시오. - 중복 값으로 인한 함정을 피하려면 고유한 동률 해소 기준과
ROWS프레임을 추가하십시오. - 결과를 기준으로 필터링하려면 CTE로 감싸십시오.
간단한 확인
기본 프레임에 대한 이해를 확인해 보십시오.
요약: 누적 합계
누적 합계는 순서가 있는 윈도우 집계입니다. SUM(amount) OVER (ORDER BY sale_date)는 암묵적인 UNBOUNDED PRECEDING-CURRENT ROW 프레임 덕분에 파티션 시작부터 현재 행까지의 행을 누적합니다.
그룹별로 다시 시작하려면 PARTITION BY를 사용하고, 중복된 정렬 값을 처리하려면 동률 해소 기준과 ROWS 프레임을 추가하십시오. 누적 값을 기준으로 필터링해야 할 때는 CTE로 감싸십시오. 다음에서는 이 레슨에서 암시한 ROWS와 RANGE의 차이를 자세히 살펴봅니다.
자주 묻는 질문
“윈도 프레임으로 누적 합계 계산하기” 강의는 무료인가요?
네 — “윈도 프레임으로 누적 합계 계산하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“윈도 프레임으로 누적 합계 계산하기”에서 뭘 배우나요?
정렬된 프레임에서 SUM OVER를 사용해 누적 합계를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“윈도 프레임으로 누적 합계 계산하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 윈도 프레임으로 누적 합계 계산하기
- ROWS와 RANGE 프레임 비교하기
- 이동 윈도에서 이동 평균 계산하기
- 누적 분포와 전체 대비 비율