BigQuery SQL フォーマッター
BigQuery(GoogleSQL)のクエリを貼り付ければ、即座に整形されます。バッククォートで囲まれた `project.dataset.table` パス、STRUCT および ARRAY 式、@名前付きクエリパラメーターのいずれにも対応しています。
BigQuery のクエリ、整形前と整形後
下の未整形のクエリは、上のエディタに読み込まれているサンプルそのものです。出力はデフォルト設定でこのフォーマッターが返す内容そのままで、手作業で整えた箇所はありません。
WITH sessions AS (SELECT user_id, session_id, TIMESTAMP_TRUNC(event_ts, HOUR) AS hr, ARRAY_AGG(event_name ORDER BY event_ts) AS events FROM `my-project.analytics.events` WHERE event_ts BETWEEN @start_ts AND @end_ts AND platform = @platform GROUP BY user_id, session_id, hr) SELECT hr, count(DISTINCT user_id) AS users, APPROX_QUANTILES(ARRAY_LENGTH(events), 100)[OFFSET(95)] AS p95_events FROM sessions WHERE ARRAY_LENGTH(events) > @min_events GROUP BY hr ORDER BY hr WITH
sessions AS (
SELECT
user_id,
session_id,
TIMESTAMP_TRUNC(event_ts, HOUR) AS hr,
ARRAY_AGG(
event_name
ORDER BY
event_ts
) AS events
FROM
`my-project.analytics.events`
WHERE
event_ts BETWEEN @start_ts AND @end_ts
AND platform = @platform
GROUP BY
user_id,
session_id,
hr
)
SELECT
hr,
count(DISTINCT user_id) AS users,
APPROX_QUANTILES(ARRAY_LENGTH(events), 100) [OFFSET(95)] AS p95_events
FROM
sessions
WHERE
ARRAY_LENGTH(events) > @min_events
GROUP BY
hr
ORDER BY
hr 対応している BigQuery の構文
汎用のフォーマッターは方言固有の構文を壊すか、そもそも受け付けません。ここに挙げるのは、このフォーマッターがテストで確認している BigQuery の構文です。
@name BigQuery の名前付きクエリパラメーターは検出されグループ化されるため、複数の CTE で使い回すパラメーターも入力は一度で済みます。
`project.dataset.table` バッククォートで囲まれた完全修飾テーブルパスは 1 つのまとまりとして保たれます。
UNNEST(array) 配列のフラット化は句の構造を保ちます。
arr[OFFSET(0)] OFFSET および ORDINAL の配列添字はそのまま保持されます。
STRUCT<...> struct 型の宣言が分割されることはありません。
BigQuery フォーマッターのよくある質問
@名前付きパラメーターを検出しますか?
はい。BigQuery の @name パラメーターは名前でグループ化されてパラメーターパネルに一覧され、値を入力して実行可能なクエリを作れます。
バッククォートのテーブルパスが壊れませんか?
壊れません。`project.dataset.table` は 1 つの引用符付き識別子として扱われ、そのまま通過します。
UNNEST、STRUCT、ARRAY の式に対応していますか?
はい。UNNEST は通常の関数呼び出しのように折り返されず句の構造を保ち、STRUCT の型宣言も途中で分断されません。内側に ORDER BY を持つ ARRAY_AGG も、その並び順が対象の集約に付いたまま維持されます。
OFFSET や ORDINAL のような配列添字は整形後も残りますか?
はい、そのままの文字列で残ります。APPROX_QUANTILES(x, 100)[OFFSET(95)] のような連鎖した式も角かっこで分断されず、書いたとおりに戻ります。ここが崩れると、動いていたパーセンタイルのクエリが構文エラーに変わります。
長い GoogleSQL クエリの中の 1 つの CTE だけ WHERE を編集できますか?
はい。各 WITH ブロックの WHERE はそのブロック名の下に別々に表示されます。目的のものを開いて条件をツリーやグラフとして編集すれば、ほかのブロックには一切触れません。
BigQuery のレガシー SQL にも対応していますか?
いいえ。このページが対象とするのは BigQuery の標準方言であり新しいクエリを書くべき言語である GoogleSQL です。レガシー SQL の角かっこによるテーブル参照は解析しません。レガシー SQL が残っているなら、整形するより移行に時間を使うほうが得策です。