来自SQL Server和一点点MySQL,我不知道如何继续使用谷歌的BigQuery Web浏览器查询工具。
似乎没有任何方法可以创建,使用或设置/声明变量。人们如何解决这个问题?或者我可能错过了BigQuery的说明或性质中明显的东西? Java API?
答案 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脚本,有时可以使用使用WITH
和CROSS 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很有用。