【问题标题】:UNNEST on GENERATE_TIMESTAMP_ARRAY() causes syntax errorGENERATE_TIMESTAMP_ARRAY() 上的 UNNEST 导致语法错误
【发布时间】: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 上运行的代码)

干杯

【问题讨论】:

    标签: sql google-bigquery unnest


    【解决方案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
      )
      

      输出表:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-14
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多