はじめに
SQLで再帰処理ってなかなか難しいの & Redshiftの例がなかなか見つけられなかったのでここに残します。
再帰処理で作ったテーブルをどう実用につかうの?!みたいなのが大事なのですがそれはまたどこかで。
数値で再帰処理
SQL
WITH RECURSIVE counter_table(cnt) AS (
-- 初期値指定
SELECT 1 AS cnt
UNION ALL
-- 再帰処理部分
SELECT cnt + 1 AS cnt FROM counter_table
-- 終了値指定
WHERE cnt < 10
)
-- ここが実際のSELECT文
SELECT cnt FROM counter_table;
処理結果
| cnt |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
月次で再帰処理
WITH RECURSIVE calendar(calendar_date) AS (
-- 初期値指定
SELECT '2022-01-01'::DATE AS calendar_date
UNION ALL
-- 再帰処理部分
SELECT dateadd(month,1,calendar_date)::DATE AS calendar_date FROM calendar
-- 終了値指定
WHERE calendar_date < '2023-12-01'::DATE
)
-- ここが実際のSELECT文
SELECT calendar_date FROM calendar;
| calendar_date |
|---|
| 2022-01-01 |
| 2022-02-01 |
| 2022-03-01 |
| 2022-04-01 |
| 2022-05-01 |
| 2022-06-01 |
| 2022-07-01 |
| 2022-08-01 |
| 2022-09-01 |
| 2022-10-01 |
| 2022-11-01 |
| 2022-12-01 |
| 2023-01-01 |
| 2023-02-01 |
| 2023-03-01 |
| 2023-04-01 |
| 2023-05-01 |
| 2023-06-01 |
| 2023-07-01 |
| 2023-08-01 |
| 2023-09-01 |
| 2023-10-01 |
| 2023-11-01 |
| 2023-12-01 |
文献
大変参考になりました。