GENERATE_TIMESTAMP_ARRAY() 上的 UNNEST 导致语法错误

UNNEST on GENERATE_TIMESTAMP_ARRAY() causes syntax error

我的目标是使用现有的 table 和 patient_id 以及相应的进出医院日期(具体时间戳)(称为 min_time 和 max_time) 创建一个新的 table,其中每个 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)

但是我收到以下错误:'Syntax error: Expected ")" but got keyword UNNEST'。我可以轻松创建 timestamp_array,所以我知道 GENERATE_TIMESTAMP_ARRAY(min_time, max_time, INTERVAL 4 HOUR) 有效。我认为问题的出现是因为格式 UNNEST(GENERATE...) 不被接受,但我不确定是否有更好的选择。 知道如何解决吗? (BigQuery 上的代码 运行)

干杯

所以这真的取决于你是想在最终输出中使用数组还是“扁平化”table。

对于最终输出中的数组...

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

根据附加的示例数据,我假设列 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
)

输出table: