DB 데이터/실무 중심 쿼리 활용법

조건 만족 누적합 (Cumulative SUM)

backend.log 2025. 5. 9. 18:03
728x90
반응형

📘 2-4. 조건 만족 누적합 (Cumulative SUM)

데이터 분석이나 실무 통계에서는 특정 조건을 만족하는 값의 누적합(Cumulative SUM)을 구해야 할 때가 많습니다.
예를 들어, 일자별 매출 누계, 유저 가입자 누적 수 등을 구할 때 사용됩니다.

📌 기본 개념: 윈도우 함수 (Window Function)

MySQL 8.0 이상에서는 OVER() 윈도우 함수를 이용해 누적합을 쉽게 계산할 수 있습니다.

SELECT 
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date) AS cumulative_sales
FROM sales;

📌 의미: 날짜 기준으로 amount 값을 누적해서 더한 컬럼을 생성합니다.

✅ 예제 1: 일자별 매출 누적합

SELECT 
  DATE(created_at) AS sale_day,
  SUM(amount) AS daily_total,
  SUM(SUM(amount)) OVER (ORDER BY DATE(created_at)) AS cumulative_total
FROM sales
GROUP BY sale_day
ORDER BY sale_day;

✅ 예제 2: 월별 신규 가입자 및 누적 가입자 수

SELECT 
  DATE_FORMAT(created_at, '%Y-%m') AS month,
  COUNT(*) AS new_users,
  SUM(COUNT(*)) OVER (ORDER BY DATE_FORMAT(created_at, '%Y-%m')) AS cumulative_users
FROM users
GROUP BY month
ORDER BY month;

✅ 예제 3: 특정 조건을 만족하는 누적 수치 (예: 유료 사용자)

SELECT 
  DATE(created_at) AS reg_day,
  SUM(CASE WHEN paid = 1 THEN 1 ELSE 0 END) AS paid_users,
  SUM(SUM(CASE WHEN paid = 1 THEN 1 ELSE 0 END)) OVER (ORDER BY DATE(created_at)) AS cumulative_paid_users
FROM users
GROUP BY reg_day
ORDER BY reg_day;

💡 실무 팁

  • MySQL 8.0 이상에서만 윈도우 함수 사용 가능 (OVER())
  • 조건부 누적합은 CASE WHEN으로 필터링한 뒤 SUM()으로 감싸는 방식
  • GROUP BY + SUM + OVER() 패턴은 시간대별 변화 추이를 파악할 때 핵심

📚 다음 글 예고

다음 포스팅에서는 2-5. RANK, ROW_NUMBER를 활용한 순위 처리 편으로 넘어갑니다.
👉 실무에서 순위 매기기, 최신 데이터 N건 추출 등에 유용한 윈도우 함수 활용법을 소개합니다.

728x90
반응형