有没有一种简单的方法可以根据BigQuery中的时区差异生成table_query?

时间:2016-08-11 15:53:22

标签: google-bigquery

旧版SQL

我使用GBQ的遗留SQL使用TABLE_QUERY函数动态查询表。我根据CURRENT_TIMESTAMP动态生成要查询的表名。例如,我选择按季度划分的表中过去14天命中数据的设备(即mydataset.hit_data_ [1-4])。

标准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中它应该是有效的。

2 个答案:

答案 0 :(得分:2)

标准SQL不支持TABLE_QUERY或TABLE_DATE_RANGE函数。相反,它支持带有特殊伪列_TABLE_SUFFIX:

的通配符表

您应该能够使用_TABLE_SUFFIX伪列上的WHERE子句重写您的查询

https://cloud.google.com/bigquery/docs/querying-wildcard-tables

答案 1 :(得分:1)

使用BigQuery Standard 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(...))
相关问题