0Pricing
SQL Interview Prep · 강의

이동 윈도에서 이동 평균 계산하기

BETWEEN PRECEDING AND CURRENT ROW로 N개 기간의 이동 평균을 계산합니다.

이동 윈도에서 이동 평균 계산하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

이동 평균에 관한 질문

분석가라면 다음 질문을 끊임없이 받습니다. "7일 이동 평균 매출을 계산하십시오." 이동 평균은 각 지점과 최근 주변 값의 평균을 구해 매일의 잡음이 많은 데이터를 평활화합니다.

면접에서 기대되는 답변은 명시적인 슬라이딩 프레임을 사용하는 윈도우 AVG입니다. 핵심은 정렬 순서를 따라 윈도우가 올바르게 이동하도록 프레임의 경계를 선택하는 것입니다.

핵심 패턴

이동 평균은 AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW)입니다. 프레임은 이동하므로 각 행에서 현재 행과 이전 n개 행을 포함합니다.

일별 행을 대상으로 7일 윈도우를 만들려면 이전 6개 행과 현재 행을 포함해 총 7개 행을 사용합니다. 여기서 하나 차이가 나는 것이 면접관이 가장 흔히 지적하는 실수입니다.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS moving_avg_7d
FROM daily_sales;

윈도우 크기를 올바르게 세기

윈도우 크기는 preceding + 1입니다. 여기서 +1은 현재 행을 뜻합니다. 예를 들면 다음과 같습니다.

  • 3행 윈도우: ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  • 7행 윈도우: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  • 30행 윈도우: ROWS BETWEEN 29 PRECEDING AND CURRENT ROW

면접에서는 이 산술을 소리 내어 말해 보십시오. 그러면 면접 패널에게 추측이 아니라 의도적으로 계산했다는 점을 보여 줄 수 있습니다.

중심 윈도우와 후행 윈도우

앞의 예시는 후행 평균입니다. 뒤쪽만 살펴보므로 인과 관계를 유지하며 예측 대시보드에서 안전하게 사용할 수 있습니다.

중심 평균은 양쪽을 모두 살펴봅니다. 예를 들어 ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING은 7행 중심 윈도우입니다. 중심 윈도우는 더 대칭적으로 평활화하지만, 실시간으로는 가장 최근 행에 대해 계산할 수 없습니다. 사용 사례에 어느 방식이 필요한지 언급해야 합니다.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
  ) AS centered_avg_7
FROM daily_sales;

윈도우 가장자리의 영향

데이터의 시작 부분에서는 아직 전체 윈도우가 존재하지 않습니다. 7일 후행 평균의 첫 번째 행에는 사용할 수 있는 행이 1개뿐이므로 AVG는 그 값 하나만 평균 냅니다.

따라서 초기 행에는 더 적은 행을 대상으로 한 "워밍업" 평균이 표시됩니다. 면접관은 이를 어떻게 처리할지 묻습니다. 방법은 두 가지입니다. 부분 윈도우를 그대로 허용하거나, 전체 개수를 요구해 초기 행을 제외할 수 있습니다.

부분 윈도우 제외하기

전체 윈도우를 사용할 수 있을 때까지 NULL을 표시하려면 같은 프레임에 COUNT(*)를 적용하고, CASE 표현식으로 짧은 윈도우를 빈 값으로 처리하십시오.

이는 경계에서의 정확성을 고민했다는 점을 보여 주는 세련된 처리이며, 많은 지원자가 빠뜨리는 세부 사항입니다.

SELECT
  sale_date,
  CASE WHEN COUNT(*) OVER w = 7
       THEN AVG(amount) OVER w
  END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

WINDOW로 프레임 재사용하기

앞의 쿼리에서는 이름이 지정된 WINDOW 절을 사용했습니다. 같은 프레임이 여러 번 나타날 때는 WINDOW w AS (...)로 한 번 정의하고 OVER w를 참조하면 쿼리를 간결하고 읽기 쉽게 유지할 수 있습니다.

PostgreSQL, MySQL 8, SQL Server는 이름이 지정된 윈도우를 지원합니다. 면접에서 이를 사용하면 윈도우 함수를 단순히 복사해 붙여 넣는 수준을 넘어선 숙련도를 보여 줄 수 있습니다.

SELECT
  sale_date,
  AVG(amount) OVER w AS avg_7d,
  SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
  ORDER BY sale_date
  ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);

달력 기준 일수와 행 수의 함정

미묘한 함정이 있습니다. 테이블에 누락된 날짜가 있으면 ROWS 6 PRECEDING은 최근 기록된 행 7개를 포함하며, 이는 달력 기준으로 7일보다 긴 기간을 포함할 수 있습니다.

간격을 반영하는 진정한 달력 기준 7일 평균을 구하려면 간격 오프셋이 있는 RANGE를 사용하거나, 먼저 완전한 날짜 시계열에 조인해 모든 날짜에 행이 있도록 하십시오. 이 차이를 언급하는 것이 바로 이전 수업에서 다룬 ROWS와 RANGE의 핵심 통찰입니다.

SELECT
  sale_date,
  AVG(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
  ) AS calendar_avg_7d
FROM daily_sales;

그룹별 이동 평균

누적 합계와 마찬가지로 이동 평균도 보통 개체별로 다시 시작해야 합니다. PARTITION BY를 추가하면 각 제품이나 매장에 다른 그룹으로 넘치지 않는 고유한 이동 윈도우가 생깁니다.

프레임과 정렬 순서는 각 분할 영역 안에서 독립적으로 작동하므로, 모든 그룹의 첫 행들이 올바르게 자체 워밍업을 시작합니다.

SELECT
  product_id,
  sale_date,
  AVG(amount) OVER (
    PARTITION BY product_id
    ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS product_ma_7d
FROM daily_sales;

평활화를 실제로 적용하기

왜 이렇게 할까요? 일별 매출은 변동이 크지만, 이동 평균을 사용하면 추세가 드러납니다. 분석가가 흔히 사용하는 답변은 원래 값과 평활화된 선을 함께 표시해 대시보드에서 신호와 잡음을 모두 보여 주는 것입니다.

짧은 이동 평균과 긴 이동 평균(예: 7일과 30일)을 비교해 모멘텀을 감지할 수도 있습니다. 이는 이동 평균 교차를 SQL로 구현한 것과 같습니다.

SELECT
  sale_date,
  amount,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)  AS ma_7,
  AVG(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;

면접 체크리스트

이동 평균 질문에 제대로 답하려면 다음을 다루십시오.

  • AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).
  • 윈도우 크기 = 이전 행 수 + 1.
  • 후행 방식과 중심 방식 중 선택하기.
  • 부분 윈도우의 워밍업과 이를 제외하는 방법.
  • 날짜가 누락된 경우의 ROWS와 RANGE 차이.
  • 개체별로 다시 시작하기 위한 PARTITION BY.

빠른 확인

일별 행을 대상으로 하는 7일 후행 이동 평균에 사용할 프레임을 고르십시오.

복습: 이동 평균

이동 평균은 AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW)이며, 윈도우 크기는 이전 행 수에 1을 더한 값입니다. 사용 사례에 맞춰 후행 방식 또는 중심 방식을 선택하고, COUNT 조건으로 워밍업 행을 처리하며, 날짜 누락을 고려해야 할 때는 RANGE 간격으로 전환하십시오.

PARTITION BY로 개체별로 다시 시작하고 이름이 지정된 WINDOW로 프레임을 재사용하십시오. 다음에는 누적 합계를 전체 대비 누적 비율로 바꾸어 보겠습니다.

자주 묻는 질문

“이동 윈도에서 이동 평균 계산하기” 강의는 무료인가요?

네 — “이동 윈도에서 이동 평균 계산하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“이동 윈도에서 이동 평균 계산하기”에서 뭘 배우나요?

BETWEEN PRECEDING AND CURRENT ROW로 N개 기간의 이동 평균을 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“이동 윈도에서 이동 평균 계산하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 윈도 프레임으로 누적 합계 계산하기
  2. ROWS와 RANGE 프레임 비교하기
  3. 이동 윈도에서 이동 평균 계산하기
  4. 누적 분포와 전체 대비 비율
← SQL Interview Prep(으)로 돌아가기