データの分析や処理に便利なBigQuery(BQ)。
大規模データの処理に優れており、テーブルに保存した大きなデータでも短時間で集計することができる。
BQでは他のDBと同じように日付データを扱うことができる。
日付データを扱えると
開始日 | 終了日 |
---|---|
2021-11-01 | 2021-11-05 |
このような開始日、終了日を指定されたデータを
日付 |
---|
2021-11-01 |
2021-11-02 |
2021-11-03 |
2021-11-04 |
2021-11-05 |
1日ずつのデータに展開したくなることがある。
ではどうやって1日ごとのデータに展開すれば良いのか。
そこで今回はBigQueryで開始終了日付の範囲を1日毎のレコードに展開する方法について紹介する。
この記事を書いている人
記事を読むメリット
BigQueryで開始終了日付の範囲を1日毎のレコードに展開する方法がわかり、データ展開で困ることがなくなる。
BigQueryで開始終了日付の範囲を1日毎のレコードに展開する方法
BigQueryで開始終了日付の範囲を1日毎のレコードに展開する方法は、少し考え方を変える必要がある。
範囲指定されたデータを1日ごとに展開するのではない。
ポイントはコレ。
ココがポイント
1日ごとの離散データを作成してから範囲指定で絞り込む
では実際にやってみよう。
1日ごとの離散データを作成してから範囲指定で絞り込む
まず1日ごとの連続した離散データを作る。
SQLは以下の通り。
SQL
WITH t1 AS ( SELECT date_seq FROM UNNEST(GENERATE_DATE_ARRAY('2021-01-01', '2021-01-31')) AS date_seq ) SELECT * FROM t1
すると↓のような結果が得られる。
結果
Row | date_seq |
1 | 2021-01-01 |
2 | 2021-01-02 |
3 | 2021-01-03 |
4 | 2021-01-04 |
5 | 2021-01-05 |
6 | 2021-01-06 |
7 | 2021-01-07 |
8 | 2021-01-08 |
9 | 2021-01-09 |
10 | 2021-01-10 |
11 | 2021-01-11 |
12 | 2021-01-12 |
13 | 2021-01-13 |
14 | 2021-01-14 |
15 | 2021-01-15 |
16 | 2021-01-16 |
17 | 2021-01-17 |
18 | 2021-01-18 |
19 | 2021-01-19 |
20 | 2021-01-20 |
21 | 2021-01-21 |
22 | 2021-01-22 |
23 | 2021-01-23 |
24 | 2021-01-24 |
25 | 2021-01-25 |
26 | 2021-01-26 |
27 | 2021-01-27 |
28 | 2021-01-28 |
29 | 2021-01-29 |
30 | 2021-01-30 |
31 | 2021-01-31 |
連続した日付データを作るのに GENERATE_DATE_ARRAY()
を使っており、得られた配列を UNNEST
で1行ずつのデータにバラしている。
あとは連続した日付データを開始日終了日のデータで絞り込めば良い。
SQL
WITH t1 AS ( SELECT date_seq FROM UNNEST(GENERATE_DATE_ARRAY('2021-01-01', '2021-01-31')) AS date_seq ), t2 AS ( SELECT DATE("2021-01-10") AS date_from, DATE("2021-01-20") AS date_to ) SELECT * FROM t1, t2 WHERE t1.date_seq BETWEEN t2.date_from AND t2.date_to
結果
Row | date_seq | date_from | date_to |
1 | 2021-01-10 | 2021-01-10 | 2021-01-20 |
2 | 2021-01-11 | 2021-01-10 | 2021-01-20 |
3 | 2021-01-12 | 2021-01-10 | 2021-01-20 |
4 | 2021-01-13 | 2021-01-10 | 2021-01-20 |
5 | 2021-01-14 | 2021-01-10 | 2021-01-20 |
6 | 2021-01-15 | 2021-01-10 | 2021-01-20 |
7 | 2021-01-16 | 2021-01-10 | 2021-01-20 |
8 | 2021-01-17 | 2021-01-10 | 2021-01-20 |
9 | 2021-01-18 | 2021-01-10 | 2021-01-20 |
10 | 2021-01-19 | 2021-01-10 | 2021-01-20 |
11 | 2021-01-20 | 2021-01-10 | 2021-01-20 |
処理の流れは異なるが、結果としては「開始終了日の範囲を1日ずつのレコードに展開した」ことになる。
まとめ
今回はBigQueryで開始終了日付の範囲を1日毎のレコードに展開する方法について紹介した。
開始終了日付の範囲を1日ずつのデータにするには、「展開する」という考えを逆転させて以下のように考える。
ココがポイント
1日ごとの離散データを作成してから範囲指定で絞り込む
GENERATE_DATE_ARRAY()
と UNNEST
で1行ずつ日付データを広めの範囲で作ってから、開始日終了日の範囲だけ between
で切り出せば良い。
他にもBigQueryのテクニックに関する記事もあるので、興味があれば見てみて欲しい。