GENERATE_TIMESTAMP_ARRAY() 上的 UNNEST 导致语法错误
Posted
技术标签:
【中文标题】GENERATE_TIMESTAMP_ARRAY() 上的 UNNEST 导致语法错误【英文标题】:UNNEST on GENERATE_TIMESTAMP_ARRAY() causes syntax error 【发布时间】:2021-11-01 23:43:32 【问题描述】:我的目标是使用一个现有的表,其中包含有患者 ID 和相应的进出医院日期(称为 min_time 和 max_time)(称为 min_time 和 max_time)创建一个新表,其中每个 4 小时组为一行。
Example
我目前的SQL代码如下:
CREATE table new_table as(
SELECT patient_id,
UNNEST(GENERATE_TIMESTAMP_ARRAY(min_time, max_time, INTERVAL 4 HOUR)) as time
FROM parent_table
ORDER BY patient_id, time)
但是我收到以下错误:'语法错误:应为“)”但得到关键字 UNNEST'。我可以轻松地创建 timestamp_array,所以我知道 GENERATE_TIMESTAMP_ARRAY(min_time, max_time, INTERVAL 4 HOUR) 有效。我相信问题的出现是因为 UNNEST(GENERATE...) 格式不被接受,但我不确定更好的选择。 知道如何解决吗? (在 BigQuery 上运行的代码)
干杯
【问题讨论】:
【参考方案1】:因此,这真的取决于您是要在最终输出中使用数组还是“扁平”表。
对于最终输出中的数组...
SELECT
patient_id,
GENERATE_TIMESTAMP_ARRAY(min_time, max_time, INTERVAL 4 HOUR) as time
FROM parent_table
ORDER BY patient_id
对于扁平化版本(听起来像您正在拍摄的内容)...
SELECT
patient_id,
time
FROM parent_table,
UNNEST(GENERATE_TIMESTAMP_ARRAY(min_time, max_time, INTERVAL 4 HOUR)) as time
ORDER BY patient_id, time
【讨论】:
【参考方案2】:根据附加的示例数据,我假设列min_time
和max_time
的数据类型是DATETIME
,因此您需要先将这些列数据类型转换为TIMESTAMP
才能使用GENERATE_TIMESTAMP_ARRAY
语法。
使用此示例数据在我这边进行了尝试:
脚本:
CREATE TABLE `myproject.mydataset.newtable` AS (
SELECT
patient_id,
DATETIME(time) time
FROM `myproject.mydataset.mytable`,
UNNEST(GENERATE_TIMESTAMP_ARRAY(CAST(min_time AS TIMESTAMP), CAST(max_time AS TIMESTAMP), INTERVAL 4 HOUR)) as time
ORDER BY patient_id, time
)
输出表:
【讨论】:
以上是关于GENERATE_TIMESTAMP_ARRAY() 上的 UNNEST 导致语法错误的主要内容,如果未能解决你的问题,请参考以下文章