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

如何用简便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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:10:53