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` 反引号包裹的完全限定表路径会保持为一个整体。
UNNEST(array) 数组展开会保持其子句结构。
arr[OFFSET(0)] OFFSET 和 ORDINAL 数组下标会原样保留。
STRUCT<...> struct 类型声明不会被拆开。
BigQuery 格式化工具常见问题
它能识别 @命名参数吗?
能。BigQuery 的 @name 参数会按名称分组列在参数面板中,可以填值生成一条可执行的查询。
它会弄乱我的反引号表路径吗?
不会。`project.dataset.table` 被当作一个带引用的标识符整体处理,原样通过。
支持 UNNEST、STRUCT 和 ARRAY 表达式吗?
支持。UNNEST 会保持子句结构,而不是被当成普通函数调用重新折行;STRUCT 类型声明不会在声明中途被拆开;带内层 ORDER BY 的 ARRAY_AGG 也会让排序保持依附在对应的聚合上。
OFFSET、ORDINAL 这类数组下标能扛过格式化吗?
能,原样保留。像 APPROX_QUANTILES(x, 100)[OFFSET(95)] 这样的链式表达式会按写法原样返回,不会在方括号处被拆开——正是这种拆分会把一条能跑的分位数查询变成语法错误。
能在很长的 GoogleSQL 查询里只编辑某一个 CTE 的 WHERE 吗?
能。每个 WITH 块的 WHERE 都会以该块的名字单独列出,你打开关心的那个,用树或图编辑它的条件,其他块完全不受影响。
支持 BigQuery 的旧版 SQL 吗?
不支持。本页针对的是 GoogleSQL,它是 BigQuery 的标准方言,新查询也应当用它来写。旧版 SQL 里用方括号引用表名的写法不会被解析。如果你手上还有旧版 SQL,把时间花在迁移上比花在格式化上更值。