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_timemax_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 导致语法错误的主要内容,如果未能解决你的问题,请参考以下文章