有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?
Posted
技术标签:
【中文标题】有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?【英文标题】:is there an easy way to generate a table_query based off of a timezone difference in BigQuery? 【发布时间】:2016-08-11 15:53:21 【问题描述】:旧版 SQL
我正在使用 GBQ 的旧版 SQL 通过 TABLE_QUERY
函数动态查询表。我根据CURRENT_TIMESTAMP
动态生成要查询的表名。例如,我从按季度分区的表中(即 mydataset.hit_data_[1-4])中过去 14 天的命中数据中选择设备。
标准 SQL
我需要将时区转换为 PST。 GBQ 标准 SQL 有TIME ZONE
转换。切换到标准 SQL,我可以使用 GBQ 标准 SQL 转换时区。但是,如果我现在尝试在同一个查询中使用 TABLE_QUERY 来执行我在 Legacy SQL 版本中所做的事情,我会得到:
Error: Table-valued functions are not supported
同时使用
有没有办法两全其美?如果前 14 天与 Q3 重叠,我想根据 Q4 的当前时间戳查询 mydataset.hit_data_3 和 mydataset.hit_data_4。
SELECT
device
FROM
TABLE_QUERY(mydataset, 'table_id = CONCAT(\"hit_data_\", STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))) OR table_id = CONCAT(\"hit_data_\", STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))) ')
WHERE
DATE(date_time) BETWEEN DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY))
AND DATE(CURRENT_DATE())
;
看起来很丑,但在GBQ中应该是有效的。
【问题讨论】:
【参考方案1】:标准 SQL 不支持 TABLE_QUERY 或 TABLE_DATE_RANGE 函数。相反,它支持带有特殊伪列 _TABLE_SUFFIX 的通配符表:
您应该能够在 _TABLE_SUFFIX 伪列上使用 WHERE 子句重写您的查询
https://cloud.google.com/bigquery/docs/querying-wildcard-tables
【讨论】:
谢谢,帕万。有没有关于这是否会支持某一天的观点的消息? 您能简单介绍一下以这种方式查询多个视图的用例吗?您能否定义一个通过在视图定义本身内部使用 _TABLE_SUFFIX 上的过滤器来实现此目的的单个视图? 我认为我们可以定义一个使用 _TABLE_SUFFIX 的单个视图,但目前我们表的命名约定将 _v 附加到原始 table_name。所以 _TABLE_SUFFIX 匹配表名* 会无意中匹配所有视图并报错。【参考方案2】:对于 BigQuery 标准 SQL,您应该使用 _TABLE_SUFFIX 伪列,该列允许您选择要从中查询的表
下面是前进的方向
SELECT *
FROM `mydataset.hit_data_*`
WHERE (_TABLE_SUFFIX = STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))
OR _TABLE_SUFFIX = STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))
)
AND DATE(date_time) BETWEEN
DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY))
AND DATE(CURRENT_DATE())
注意:您需要确保您使用的是标准 SQL 支持的函数 例如,而不是
QUARTER(TIMESTAMP(...))
你应该使用
EXTRACT(QUARTER FROM TIMESTAMP(...))
【讨论】:
以上是关于有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?的主要内容,如果未能解决你的问题,请参考以下文章