【SQL】WITH RECURSIVE句を使って日付のfrom-toを縦持ちのデータに展開する

Snowflake

はじめに

実行環境: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されていきます。

タイトルとURLをコピーしました