コード日進月歩

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

BigQueryで単一のクエリ内で値を定義して定数のように使い回す

いろんなテーブルをまたいで利用するときに似たようなクエリをつくるのでその時のための機能

前提条件

  • STANDARD SQLです(記載タイミングでレガシーのほうを使っているほうが稀かなと思いますが念の為)

やり方

定数定義のような機構はこの記事を書いている時点では存在しないので値だけを返す一時的なユーザー定義関数を作る。

ユーザー定義関数は CREATE FUNCTION を利用する、今回利用する範囲での最低限の文法としては以下

# 関数定義
CREATE TEMPORARY FUNCTION {{一時定義の関数名}}() AS ( {{返却したい処理}} )  

もっとオプションがあるが、そちらに関しては参考リンクのドキュメントをご覧いただければと思います。

実行時のYYYYMMDDの値をとってクエリに活用する。

以下の例は dateが実行日と一致するものかつ、last_update_date内に実行日のYYYYMMDDが含まれているものを探すクエリ

CREATE TEMPORARY FUNCTION QUERY_EXECUTE_NOW_DATE()
AS(
  FORMAT_TIMESTAMP("%Y%m%d" ,CURRENT_TIMESTAMP)
);

SELECT * FROM `example-project.example-dataset.example_table_20100801`
WHERE data = QUERY_EXECUTE_NOW_DATE()
AND last_update_date = QUERY_EXECUTE_NOW_DATE()

参考リンク