基于过往日期新增两列 - PrestoSQL实现求助
PrestoSQL 实现按ID判断过往及近2个月是否出现COVID=1的解决方案
针对你的需求,不需要用GROUP BY聚合行(会丢失原表的每条记录),用窗口函数可以保留所有原始数据的同时,按ID计算两个标志列,以下是可行的SQL语句:
SELECT Date, ID, COVID, -- 该ID截至当前日期是否曾出现COVID=1 MAX(COVID) OVER ( PARTITION BY ID ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS EverCOVIDBefore, -- 该ID在当前日期过去2个月内是否曾出现COVID=1 MAX(COVID) OVER ( PARTITION BY ID ORDER BY Date RANGE BETWEEN INTERVAL '2' MONTH PRECEDING AND CURRENT ROW ) AS COVID_last_2_mth FROM your_table_name;
关键逻辑说明:
- EverCOVIDBefore:按ID分组、日期排序,取该ID从第一条记录到当前行的COVID最大值。只要过往有过1,结果就是1,否则为0。
- COVID_last_2_mth:按ID分组、日期排序,取当前日期往前推2个月范围内的COVID最大值,判断近2个月是否出现过阳性。
注意事项:
- 把语句中的
your_table_name替换成你的实际表名。 - 如果
Date字段是字符串格式,需要先转为日期类型,例如用CAST(Date AS DATE)替换所有Date字段。 - 若窗口RANGE方式报错,可改用条件判断的写法(基于当前日期往前2个月):
MAX(CASE WHEN Date >= DATE_ADD('month', -2, CURRENT_DATE) THEN COVID ELSE 0 END) OVER (PARTITION BY ID) AS COVID_last_2_mth
内容的提问来源于stack exchange,提问作者Alexander Peterson
相关产品推荐
相关产品推荐

