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 が残っているなら、整形するより移行に時間を使うほうが得策です。