我使用GBQ的遗留SQL使用TABLE_QUERY
函数动态查询表。我根据CURRENT_TIMESTAMP
动态生成要查询的表名。例如,我选择按季度划分的表中过去14天命中数据的设备(即mydataset.hit_data_ [1-4])。
我需要将时区转换为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中它应该是有效的。
答案 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(...))