You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:36:01