次のようなフォーマットで月別にテーブルがあるとする。
nginx.access_201412
nginx.access_201501
nginx.access_201502
nginx.access_201503
2015-02-15 から 2015-03-03 までの範囲指定をしたいときは、料金節約のため、次のテーブルのみをスキャンしたい。
nginx.access_201502
nginx.access_201503
TABLE_DATE_RANGE は日付毎に分かれているテーブルにしか使えないため、TABLE_QUERY を駆使する。
SELECT
*
FROM (
TABLE_QUERY(nginx, "
TIMESTAMP(
REGEXP_EXTRACT(table_id, r'access_(\d{4})\d{2}') + '-' +
REGEXP_EXTRACT(table_id, r'access_\d{4}(\d{2})') + '-01 00:00:00'
) <= TIMESTAMP('2015-03-03 00:00:00')
AND
TIMESTAMP(
REGEXP_EXTRACT(table_id, r'access_(\d{4})\d{2}') + '-' +
REGEXP_EXTRACT(table_id, r'access_\d{4}(\d{2})') + '-01 00:00:00'
) >=
TIMESTAMP(
STRING(YEAR(TIMESTAMP('2015-02-15 00:00:00'))) + '-' +
STRING(MONTH(TIMESTAMP('2015-02-15 00:00:00'))) + '-01 00:00:00'
)
"))
WHERE
time >= '2015-02-15 00:00:00' AND time < '2015-03-03 00:00:00'
...
もっとスマートな方法があったら教えて下さい( ´∀`)