SELECT DISTINCT -- DISTINCT指定することで配列データからレコードを増幅する id, start_date, end_date, target_month FROM dataset.table CROSS JOIN UNNEST( GENERATE_DATE_ARRAY( start_date, -- この日から end_date, -- この日まで INTERVAL 1 MONTH -- 1ヶ月毎に区切る ) ) target_month -- 上記で作成した項目に名称をつける
上記ではstart_dateからend_dateの期間を1ヶ月毎に区切って、レコードを増幅します。
id | start_date | end_date |
---|---|---|
123 | 2020-01-01 | 2020-06-01 |
の場合は、
target_monthには、以下のような配列項目が設定されます。
id | start_date | end_date | target_month |
---|---|---|---|
123 | 2020-01-01 | 2020-06-01 | '2020-01-01' '2020-02-01' '2020-03-01' '2020-04-01' '2020-05-01' '2020-06-01' |
これをSELECT DISTINCTすると、同じ年月日ごとに1レコードずつが作成されるため、以下のようにレコードが作成されます。
id | start_date | end_date | target_month |
---|---|---|---|
123 | 2020-01-01 | 2020-06-01 | 2020-01-01 |
123 | 2020-01-01 | 2020-06-01 | 2020-02-01 |
123 | 2020-01-01 | 2020-06-01 | 2020-03-01 |
123 | 2020-01-01 | 2020-06-01 | 2020-04-01 |
123 | 2020-01-01 | 2020-06-01 | 2020-05-01 |
123 | 2020-01-01 | 2020-06-01 | 2020-06-01 |
用途としては、id単位で1レコードにまとめられているデータがあった場合に、それを各月毎に分解して、月額単位で値を集計したりする場合に活用可能です。