'최근 7일', '올해 1월~오늘까지'처럼
특정 기간의 날짜를 모두 나열해야 할 때가 있습니다.
날짜 테이블을 조인할 수도 있지만,
급하게 ad-hoc 분석을 하거나 날짜 테이블이 없는 환경이라면 어떻게 할까요?
orders에서 날짜를 가져와 쓰면, 해당 테이블에 없는 날짜는 누락됩니다.
게다가 날짜를 직접 만들려고 UNION으로 하나씩 나열하면, 날짜 범위가 길어질수록 쿼리가 불필요하게 길어집니다.
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 반복 제거 → 쿼리 간결화