无LEAD/LAG函数时计算行间时间差的SQL实现需求
解决方案
由于无法使用LEAD()这类窗口函数,我们可以通过自连接+聚合函数的方式实现需求,核心思路是为每条记录找到比它更新的状态的最早开始时间作为结束时间,最新的记录则用NOW()填充。
假设你的表名为status_log,可以使用以下SQL查询:
SELECT s1.状态, s1.开始时间, COALESCE(MIN(s2.开始时间), NOW()) AS 结束时间 FROM status_log s1 LEFT JOIN status_log s2 ON s2.开始时间 > s1.开始时间 GROUP BY s1.状态, s1.开始时间 ORDER BY s1.开始时间 DESC;
逻辑说明:
- 自连接关联:通过
s2.开始时间 > s1.开始时间,为每条s1记录关联所有比它更新的状态记录。 - 聚合取最小时间:用
MIN(s2.开始时间)获取比当前记录更新的最早状态时间,也就是当前状态的结束时间。 - 处理最新记录:对于没有更新状态的最新记录(即
s2无匹配数据),MIN(s2.开始时间)会返回NULL,通过COALESCE()将其替换为NOW()。 - 排序输出:按
开始时间降序排列,确保输出顺序与期望一致。
内容的提问来源于stack exchange,提问作者Tani1297
相关产品推荐
相关产品推荐

