【问题标题】:Standardizing time between entries for time series data in bigquery标准化 bigquery 中时间序列数据条目之间的时间
【发布时间】:2021-11-01 21:02:45
【问题描述】:

所以我有这个 BigQuery 代码来处理 MIMIC 数据库

所以我在 BigQuery 中有这张表,其中包含大量个人的时间序列信息,但在不同的时间,所以有些可能每 5 分钟有一次,有些每 5 小时有一次,有些分散。

我想构建一个表格版本,其中每个人每 4 小时有一个条目,仅此而已,即每 4 小时间隔内的条目将被平均。

这就是我现在拥有的

WITH minmax as(
SELECT subject_id, hadm_id, icustay_id , min(charttime) as mint, max(charttime) as maxt
FROM `projectx-mcgill.preprocessing.overalltable_Lab_withventparams`
GROUP BY icustay_id, subject_id, hadm_id
ORDER BY icustay_id, subject_id, hadm_id
    ), grid as (
    SELECT icustay_id, subject_id, hadm_id, 
    
    UNNEST(GENERATE_TIMESTAMP_ARRAY(CAST(mint as timestamp), CAST(maxt as timestamp), INTERVAL 4 HOUR)) as start_time

    FROM minmax
    GROUP BY icustay_id, subject_id, hadm_id,mint,maxt
    ORDER BY icustay_id, subject_id, hadm_id)

我试图让 start_time 类似于 postgres 的 generate_sequence() 函数,这样我就可以在渐进的 4 小时标记处获得每个人的信息,但我不断收到“语法错误:预期的”(“但得到了关键字 UNNEST”。我发现某处说 UNNEST 不能在 FROM 子句之前,但是当我将它移到后面时,我收到一个新错误,说表没有分组或聚合。知道我能做什么吗?

【问题讨论】:

标签: google-bigquery unnest


【解决方案1】:

你可以:

  1. 创建时间戳表:
    WITH timestamps AS
        (
            SELECT *
            FROM   UNNEST(GENERATE_TIMESTAMP_ARRAY('2021-01-01 00:00:00', CURRENT_TIMESTAMP,
                                INTERVAL 4 HOUR)) AS ts
        )
    SELECT * FROM timestamps AS t
  1. 从您的数据中获取不同的实体:
    SELECT DISTINCT subject_id, hadm_id, icustay_id FROM <your_table>
  1. CROSS JOIN 前两个关系使得每个“实体”的每个时间戳都有一行

  2. 最后,LEFT/RIGHT 将上一步中的关系与您的数据聚合、加入时间戳(四舍五入或以其他方式截断为 4 小时间隔)、根据需要聚合并使用 IFNULL() 或 @987654326 之类的东西@ 来处理那些不包含实体数据的时间戳。

注意:MIMIC 数据库/projectx-mcgill 似乎不是公共数据集,但如果您能够提供一些数据的小样本,我可以提供此方法的更具体示例。

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 2015-07-31
    • 2013-10-15
    • 2018-11-11
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多