기간별 변화
LAG로 전월 대비 증가율과 전일 대비 변동량을 계산합니다.
기간별 변화은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
분석가 면접에서 반드시 나오는 질문
데이터 분석가 직무 면접을 본다면 “전월 대비 증가율을 계산하세요” 또는 “일별 변화량은 얼마인가요?”와 같은 질문을 예상하십시오. 거의 피할 수 없는 질문입니다.
핵심 구성 요소는 LAG입니다. 이전 기간의 값을 가져온 다음 절대 변화량이나 백분율 변화를 계산합니다. 이 레슨에서는 면접관이 평가하는 기간 대비 변화 패턴을 LAG로 구현하는 방법을 다룹니다.
LAG를 사용한 절대 변화량
가장 간단한 형태는 현재 기간과 직전 기간의 원시 차이를 구하는 것입니다. LAG로 이전 값을 가져와 바로 뺄셈을 수행합니다.
정렬된 첫 행에는 이전 행이 없으므로 변화량은 NULL입니다. 이는 버그가 아니라 올바른 결과입니다. 실제로 비교할 이전 기간이 없기 때문입니다.
SELECT
month,
revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;백분율 변화
면접관은 대개 증가율을 백분율로 표현하기를 원합니다. 공식은 (현재 값 - 이전 값) / 이전 값에 100을 곱하는 것입니다. LAG를 사용해 이를 직접 표현하십시오.
연산 순서와 괄호에 주의하십시오. 괄호 하나를 잘못 배치하는 것은 긴장된 상황에서 흔히 하는 실수입니다.
SELECT
month,
revenue,
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;정수 나눗셈 피하기
많은 지원자가 빠지는 함정이 있습니다. revenue가 정수라면 정수 나눗셈을 사용하는 데이터베이스에서 (110 - 100) / 100은 0으로 계산됩니다.
부동 소수점 리터럴인 100.0을 곱하거나 먼저 CAST를 사용해 십진수로 변환하여 부동 소수점 연산을 강제하십시오. 이를 먼저 언급하면 세부 사항까지 주의하고 있음을 보여 줄 수 있습니다.
SELECT
month,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month), 2
) AS pct_growth
FROM monthly_sales;더 깔끔한 방법: CTE에서 한 번만 계산하기
LAG를 두 번 호출하면 분자와 분모를 반복해서 작성해야 하므로 오타가 나기 쉽습니다. 흔히 사용하는 리팩터링 방법은 CTE에서 이전 값을 한 번 계산한 다음 바깥쪽 질의에서 산술 연산을 수행하는 것입니다.
이 방식은 화이트보드 면접에서 읽기 좋고 두 LAG 호출의 내용이 서로 달라지는 문제도 방지합니다.
WITH t AS (
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
)
SELECT
month,
revenue,
ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;0으로 나누는 경우 방지하기
이전 기간의 값이 0일 수 있다면 백분율 공식에서 0으로 나누게 되어 오류가 발생합니다. NULLIF(prev, 0)을 사용하면 분모가 NULL이 되고, 예외 대신 결과도 NULL이 됩니다.
방어적인 나눗셈 처리는 실무를 고려하는 지원자에게서 면접관이 알아보는 작은 세심함입니다.
SELECT
month,
revenue,
100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
) s;그룹별 기간 대비 변화
실제 질문은 대부분 범위가 정해져 있습니다. 예를 들어 제품별 또는 지역별 전월 대비 증가율을 묻습니다. PARTITION BY를 추가하여 각 그룹의 시계열이 자기 그룹의 값과만 비교되도록 하십시오.
각 그룹에서 가장 이른 달은 NULL로 초기화되므로 제품 간 경계를 넘어 비교하지 않습니다.
SELECT
product_id,
month,
revenue,
revenue - LAG(revenue) OVER (
PARTITION BY product_id
ORDER BY month
) AS mom_change
FROM product_sales;오프셋을 사용한 전년 대비 변화
행이 한 달 간격인 월별 데이터에서 전년 대비 변화를 구하려면 12개 행 이전의 값과 비교합니다. 오프셋 인수를 사용하면 이를 직접 처리할 수 있습니다: LAG(revenue, 12).
이는 누락된 달 없이 매달 한 행이 존재한다고 가정합니다. 달이 누락될 수 있다면 명시적인 날짜를 기준으로 조인해야 하며, 이는 말로 언급할 만한 세부 사항입니다.
SELECT
month,
revenue,
revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;비교하기 전에 사전 집계하기
원시 이벤트 테이블은 월별로 미리 합산되어 있지 않습니다. 현실적인 답변에서는 먼저 기간마다 한 행이 되도록 집계한 다음, 보통 CTE를 통해 집계 결과에 LAG를 적용합니다.
집계하지 않은 행에 LAG를 적용하면 월별 합계가 아니라 개별 거래를 비교하게 됩니다. 이는 흔히 발생하는 논리적 오류입니다.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
)
SELECT mth, revenue,
revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;첫 번째 NULL 해석하기
면접관은 때때로 이렇게 묻습니다. "첫 행의 증가율이 왜 NULL인가요? 그래도 괜찮은가요?" 올바른 답은 다음과 같습니다. 이전 기간이 없으므로 변화량은 정의되지 않으며, NULL이 이를 정확하게 나타냅니다.
비즈니스에서 대신 0을 원한다면 LAG(revenue, 1, 0) 또는 COALESCE를 사용할 수 있지만, 의도한 의미와 일치할 때만 사용해야 합니다.
증가 방향 표시하기
면접관은 때때로 질문을 확장합니다. "각 달이 증가했는지, 감소했는지, 그대로인지도 표시해 주세요." LAG 비교를 CASE 표현식으로 감싸십시오.
이전 값과 비교하면 숫자 변화량 위에 사람이 읽기 쉬운 추세 열을 추가할 수 있습니다. 비교 대상이 없는 첫 기간에는 NULL 또는 기본 레이블을 자연스럽게 표시할 수도 있습니다.
SELECT
month,
revenue,
CASE
WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
ELSE 'flat'
END AS trend
FROM monthly_sales
ORDER BY month;빠른 확인
백분율 변화 질의에서 흔히 하는 실수를 찾아보십시오.
복습
기간 대비 변화는 LAG와 산술 연산을 결합해 구합니다.
- 절대 변화량:
value - LAG(value) OVER (ORDER BY period). - 백분율 변화:
100.0 * (value - prev) / NULLIF(prev, 0). - 부동 소수점 연산을 강제하고, 0으로 나누는 경우를 방지하며, 기간마다 한 행이 되도록 사전 집계하십시오.
PARTITION BY로 범위를 지정하고, 전년 대비 변화에는 오프셋을 사용하십시오.
다음에는 NTILE을 사용해 행을 구간과 등급으로 나누어 보겠습니다.
자주 묻는 질문
“기간별 변화” 강의는 무료인가요?
네 — “기간별 변화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“기간별 변화”에서 뭘 배우나요?
LAG로 전월 대비 증가율과 전일 대비 변동량을 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“기간별 변화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.