没有变量的BigQuery查询创建?

时间:2014-08-22 02:08:29

标签: google-bigquery

来自SQL Server和一点点MySQL,我不知道如何继续使用谷歌的BigQuery Web浏览器查询工具。

似乎没有任何方法可以创建,使用或设置/声明变量。人们如何解决这个问题?或者我可能错过了BigQuery的说明或性质中明显的东西? Java API?

4 个答案:

答案 0 :(得分:1)

目前无法在BigQuery中设置/声明变量。如果您需要变量,则需要将它们剪切并粘贴到您需要的位置。请随意将其作为功能请求here提交。

答案 1 :(得分:1)

它不优雅,而且很痛苦,但是......

我们处理它的方式是使用python脚本替换查询中的“变量占位符”,而不是通过API发送修改后的查询。

我已经打开了一个要求“动态SQL”功能的功能请求。

答案 2 :(得分:1)

现在可以使用SQL声明和设置变量。有关更多信息,请参见the documentation,但这是一个示例:

-- Declare a variable to hold names as an array.
DECLARE top_names ARRAY<STRING>;
-- Build an array of the top 100 names from the year 2017.
SET top_names = (
  SELECT ARRAY_AGG(name ORDER BY number DESC LIMIT 100)
  FROM `bigquery-public-data`.usa_names.usa_1910_current
  WHERE year = 2017
);
-- Which names appear as words in Shakespeare's plays?
SELECT
  name AS shakespeare_name
FROM UNNEST(top_names) AS name
WHERE name IN (
  SELECT word
  FROM `bigquery-public-data`.samples.shakespeare
);

答案 3 :(得分:1)

如果要避免使用BQ脚本,有时可以使用使用WITHCROSS JOIN的习惯用法。

在以下示例中:

  • events表中包含一些带有时间戳的事件
  • reports表包含事件的偶然汇总值
  • 目标是编写仅生成增量(非重复)聚合行的查询

这是通过

实现的
  • 引入一个state临时表,该表将查看目标表以获取汇总结果
  • 为实际查询确定参数(params
  • 参数与实际查询一起CROSS JOIN
  • 允许参数行的列用于约束查询
  • 此查询将重复返回相同的结果
  • 直到结果本身被添加到reports表中
WTIH state AS (
  SELECT
    -- what was the newest report's ending time?
    COALESCE(
        SELECT MAX(report_end_ts) FROM `x.y.reports`, 
        TIMESTAMP("2019-01-01")
      ) AS latest_report_ts,
    ...
),
params AS (
  SELECT
    -- look for events since end of last report
    latest_report_ts AS event_after_ts,
    -- and go until now
    CURRENT_TIMESTAMP() AS event_before_ts
)

SELECT 
  MIN(event_ts) AS report_begin_ts,
  MAX(event_ts) AS report_end_ts
  COUNT(1) AS event_count, 
  SUM(errors) AS error_total
FROM `x.y.events`
CROSS JOIN params
WHERE event_ts > event_after_ts
  AND event_ts < event_before_ts
)

这种方法对bigquery scheduled queries很有用。