[SQL] RECURSIVE로 날짜 범위 한 번에 만들기

Unit·2025년 8월 14일

SQL

목록 보기
34/59

'최근 7일', '올해 1월~오늘까지'처럼
특정 기간의 날짜를 모두 나열해야 할 때가 있습니다.

날짜 테이블을 조인할 수도 있지만,
급하게 ad-hoc 분석을 하거나 날짜 테이블이 없는 환경이라면 어떻게 할까요?


❌ 거래 테이블에서 날짜 추출

orders에서 날짜를 가져와 쓰면, 해당 테이블에 없는 날짜는 누락됩니다.
게다가 날짜를 직접 만들려고 UNION으로 하나씩 나열하면, 날짜 범위가 길어질수록 쿼리가 불필요하게 길어집니다.


✅ RECURSIVE로 날짜 생성

RECURSIVE를 사용하면 시작일과 종료일만 지정해도 모든 날짜를 한 번에 만들 수 있습니다.
즉, UNION을 반복할 필요 없이 간결하고 유지보수가 쉬운 쿼리가 됩니다.

WITH RECURSIVE dates AS (
    SELECT DATE '2025-08-01' AS dt
    UNION ALL
    SELECT dt + INTERVAL '1 day'
    FROM dates
    WHERE dt <= DATE '2025-08-14'
)
SELECT d.dt
     , COALESCE(SUM(o.sales), 0) AS total_sales
FROM dates d
LEFT JOIN orders o
       ON d.dt = o.order_date
GROUP BY d.dt
ORDER BY d.dt;

💡 장점

  • 날짜 테이블 없이도 손쉽게 날짜 생성
  • 불필요한 UNION 반복 제거 → 쿼리 간결화
  • 누락 없는 집계 가능
  • 주간·월간 등 다른 주기에도 확장 가능
profile
협업, 유지보수, 최적화를 고려한 데이터 실무 팁을 정리합니다.

0개의 댓글