BigQuery处理MIMIC时间序列按4小时间隔对齐报错求解
BigQuery固定间隔时间序列聚合解决方案
错误原因
- BigQuery 不支持将
UNNEST直接写在SELECT的字段列表中,必须放在FROM子句中通过交叉连接展开数组 - 你在
gridCTE 中额外添加了不必要的GROUP BY语句,minmax已经是按唯一标识分组后的聚合结果,每个icustay_id仅对应唯一的时间上下限,二次分组会触发未聚合字段报错
修正后完整代码
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 ), grid AS ( SELECT m.icustay_id, m.subject_id, m.hadm_id, start_time FROM minmax m, UNNEST(GENERATE_TIMESTAMP_ARRAY(CAST(m.mint AS TIMESTAMP), CAST(m.maxt AS TIMESTAMP), INTERVAL 4 HOUR)) AS start_time ) -- 以下为4小时间隔均值聚合逻辑,可根据实际字段调整 SELECT g.icustay_id, g.subject_id, g.hadm_id, g.start_time, -- 替换为你需要聚合的指标字段即可 AVG(o.your_column1) AS avg_column1, AVG(o.your_column2) AS avg_column2 FROM grid g LEFT JOIN `projectx-mcgill.preprocessing.overalltable_Lab_withventparams` o ON o.icustay_id = g.icustay_id AND o.charttime >= g.start_time AND o.charttime < TIMESTAMP_ADD(g.start_time, INTERVAL 4 HOUR) GROUP BY g.icustay_id, g.subject_id, g.hadm_id, g.start_time ORDER BY g.icustay_id, g.start_time
关键调整说明
- 移除了
gridCTE中冗余的GROUP BY和ORDER BY语句,避免不必要的聚合校验错误 - 通过隐式交叉连接(
FROM minmax m, UNNEST(...))展开时间数组,实现和PostgreSQLgenerate_series完全一致的连续时间格生成效果 - 补充的左关联逻辑可以保证无数据的时间区间也会保留行记录,满足时间序列的连续性要求
内容的提问来源于stack exchange,提问作者Nathan de Lara
相关产品推荐
相关产品推荐

