コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

BigQueryで日付分割テーブルを期間で区切って検索対象にする場合は_TABLE_SUFFIXとBETWEENを使う

そういえば書いたことがなかったのでメモとして

前提

分割テーブルとは

ここで説明する分割テーブルは以下の内容を指す

パーティション分割テーブルはパーティションと呼ばれるセグメントに分割された特殊なテーブルで、データの管理や照会をより簡単に行うことができます。大きいテーブルを小さいパーティションに分割することでクエリのパフォーマンスを向上させることができ、クエリで読み取られるバイト数を減らすことによってコストを管理できます。 - パーティション分割テーブルの概要  |  BigQuery  |  Google Cloud

実際のUI上はどうなるか

yyyymmddを意識した形でテーブルを作っていった場合、UIだと以下のようになる

f:id:shinkufencer:20200731215845p:plain

また、テーブルとしては以下のようになる

`demoproject-111111.hoge.logs20190424` 

クエリの書き方

前提としてのワイルドカード

基本はワイルドカードを使う

ワイルドカード テーブルは、ワイルドカード式に一致するすべてのテーブルが結合されたものを表します。たとえば次の FROM 句は、ワイルドカード式 gsod* を使用しており、noaa_gsod データセット内の gsod という文字列で始まるすべてのテーブルに一致します。 - ワイルドカード テーブルを使用した複数テーブルに対するクエリ  |  BigQuery  |  Google Cloud

たとえば例に上げたような以下のテーブルがある場合

`demoproject-111111.hoge.logs20190424` 

201904すべてのデータを取りたい場合は以下のような記述になる

SELECT * FROM `carbon-187007.fastly_staging.logs201904*` LIMIT 1000

_TABLE_SUFFIXで絞り込む

ワイルドカードだと範囲が広すぎるので絞りたい…という場合はBETWEENをつかうことで実現できる

たとえば20190422から20190424までの場合は先程のクエリを改変して以下のようにする

SELECT * FROM `carbon-187007.fastly_staging.logs201904*` 
WHERE _TABLE_SUFFIX BETWEEN '22' AND '24'

これで範囲を指定して取得することができる

参考リンク