如何用简便SQL添加工序间间隔时间记录行?
解决方案
可以用**窗口函数LEAD()**获取下一道工序的开始时间,结合UNION ALL合并原始数据和间隔记录,无需拆分多个独立查询。假设表名为production_process,SQL语句如下:
WITH process_with_next AS ( SELECT SFC, WORK_CENTER, OPERATION, StartTime, EndTime, Duration, -- 按SFC分组、StartTime排序,取当前行的下一道工序开始时间 LEAD(StartTime) OVER (PARTITION BY SFC ORDER BY StartTime) AS next_start_time FROM production_process ) -- 输出原始工序记录 SELECT SFC, WORK_CENTER, OPERATION, StartTime, EndTime, Duration FROM process_with_next UNION ALL -- 生成并输出间隔记录(仅当下一道工序存在时) SELECT SFC, CONCAT(WORK_CENTER, '_gap') AS WORK_CENTER, '000' AS OPERATION, EndTime AS StartTime, next_start_time AS EndTime, TIMESTAMPDIFF(SECOND, EndTime, next_start_time) AS Duration FROM process_with_next WHERE next_start_time IS NOT NULL -- 按时间顺序排序最终结果 ORDER BY SFC, StartTime;
关键说明:
LEAD()窗口函数:按SFC分组、工序开始时间排序,高效获取当前工序的下一道工序开始时间,避免了自关联查询。- 时间差计算:
TIMESTAMPDIFF(SECOND, ...)用于计算秒级间隔,不同数据库可调整函数(比如PostgreSQL用EXTRACT(EPOCH FROM (next_start_time - EndTime)))。 - 结果排序:最后通过
ORDER BY SFC, StartTime保证原始工序和间隔记录的顺序正确。
这种写法只需扫描基础表一次,逻辑简洁且性能更优,相比多查询拼接的方式更易维护。
内容的提问来源于stack exchange,提问作者spolale
相关产品推荐
相关产品推荐

