動機としては、ある期間内の日付を全て列挙し、日付でGROUP BY
した調査対象のtableにOUTER JOIN
をかけることで、ある日付が集計結果で抜けることなくちゃんと0件であることを出そうとしていて見つけました。
1. 再帰 CTE
RECURSIVE
って正直使ったことなかったんですが、便利ですね。
WITH RECURSIVE date_series AS (
SELECT DATE('2025-01-01') AS date_ -- 開始日
UNION ALL
SELECT DATE_ADD(date_, INTERVAL 1 DAY)
FROM date_series
WHERE date_ < DATE('2025-01-31') -- 終了日
)
SELECT date_ FROM date_series
ORDER BY date_;
Reference
2. GENERATE_DATE_ARRAY()
うーん、まあ関数が用意されているならこちらでいいかな…
SELECT GENERATE_DATE_ARRAY('2025-01-01', '2025-01-31') AS example;
Reference