PostgreSQL视图按well_id计算相邻reported_date小时差的计算列问题
PostgreSQL按分组计算相邻行时间差(小时)解决方案
你需要使用PostgreSQL内置的LAG()窗口函数实现需求,核心逻辑是在well_id分组内按时间排序后取前一行的reported_date,再计算时间差转小时单位即可,你原有代码中的DATE_PART参数用法、跨行取值逻辑均存在错误,无需通过GROUP BY处理跨行计算。
核心实现代码
SELECT p.well_id, p.reported_date, -- 保留你原有查询的其他字段 COALESCE( g.Delta_Hours, -- 优先取你原有逻辑的Delta_Hours值 -- 计算当前行与上一行时间的小时差值,支持小数精度 EXTRACT(EPOCH FROM (p.reported_date - LAG(p.reported_date) OVER ( PARTITION BY p.well_id ORDER BY p.reported_date ))) / 3600, 0 -- 分组内第一行无前置数据时的默认值,可按需调整为NULL等 ) AS Delta_Hours -- 你原有FROM表关联逻辑,比如: -- FROM your_table p -- LEFT JOIN other_table g ON 关联条件 -- 若你没有其他聚合计算需求,可以直接删除GROUP BY子句 GROUP BY p.well_id, p.reported_date ORDER BY p.well_id, p.reported_date;
逻辑说明
LAG(p.reported_date) OVER (PARTITION BY p.well_id ORDER BY p.reported_date):按well_id划分窗口分组,每组内按reported_date升序排序,取当前行的上一行reported_date值- 两个
timestamp类型值相减得到interval类型的时间差,用EXTRACT(EPOCH FROM 时间差)提取时间差对应的总秒数,除以3600即可得到小时单位的差值 COALESCE按优先级处理空值,你可以根据业务需求调整默认值或删减参数
内容的提问来源于stack exchange,提问作者Justin Massaro
相关产品推荐
相关产品推荐

