はじめに
実行環境:Snowflake
使用言語:SQL
以下のようなサンプルデータを使用して検証します。

サンプルデータを作成するクエリはこちら↓
-- テーブルの作成
CREATE OR REPLACE TABLE source_table AS(
id Varchar,
date_from DATE,
date_to DATE
);
-- データ挿入
INSERT INTO source_table (id, date_from, date_to) VALUES
('A001', '2024-10-29', '2024-10-31');
日付を展開し、縦持ちのデータにする
今回の検証での完成形は以下の通りです。

実行するクエリはこちらです↓
CREATE OR REPLACE TABLE date_table AS(
WITH RECURSIVE date_series AS (
SELECT
id,
date_from AS date,
date_from,
date_to
FROM source_table
UNION ALL
SELECT
id,
DATEADD(day, 1, date),
date_from,
date_to
FROM date_series
WHERE date < date_to
)
SELECT
id,
date,
date_from,
date_to
FROM date_series
ORDER BY
id,
date
);
解説
UNION ALLの上下で非再帰項と再帰項に分けて考えます。

再帰項のWHERE句の条件に当てはまる限り、再帰項で指定したクエリの抽出レコードが非再帰項にUNION ALLされていきます。


