标准化 bigquery 中时间序列数据条目之间的时间
Posted
技术标签:
【中文标题】标准化 bigquery 中时间序列数据条目之间的时间【英文标题】:Standardizing time between entries for time series data in 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 子句之前,但是当我将它移到后面时,我收到一个新错误,说表没有分组或聚合。知道我能做什么吗?
【问题讨论】:
meta.stackexchange.com/a/66378/507852 【参考方案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
-
从您的数据中获取不同的实体:
SELECT DISTINCT subject_id, hadm_id, icustay_id FROM <your_table>
CROSS JOIN
前两个关系使得每个“实体”的每个时间戳都有一行
最后,LEFT/RIGHT
将上一步中的关系与您的数据聚合、加入时间戳(四舍五入或以其他方式截断为 4 小时间隔)、根据需要聚合并使用 IFNULL()
或 @987654326 之类的东西@ 来处理那些不包含实体数据的时间戳。
注意:MIMIC 数据库/projectx-mcgill
似乎不是公共数据集,但如果您能够提供一些数据的小样本,我可以提供此方法的更具体示例。
【讨论】:
以上是关于标准化 bigquery 中时间序列数据条目之间的时间的主要内容,如果未能解决你的问题,请参考以下文章