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

MySQL按ticket_id分组计算ticket_event表状态流转时间差方案

实现方案

核心思路

先按工单ID分组,把每个工单的各状态对应的更新时间提取为独立字段,再对指定的状态对做时间差计算,不存在的状态对直接返回0即可。

可直接运行的查询语句

SELECT
    ticket_id,
    -- OPEN到IN_PROGRESS的时间差
    IF(open_time > 0 AND in_progress_time > open_time, in_progress_time - open_time, 0) AS open_to_inprogress_timediff,
    -- OPEN到DONE的时间差
    IF(open_time > 0 AND done_time > open_time, done_time - open_time, 0) AS open_to_done_timediff,
    -- OPEN到CLOSE的时间差
    IF(open_time > 0 AND close_time > open_time, close_time - open_time, 0) AS open_to_close_timediff,
    -- DONE到CLOSE的时间差
    IF(done_time > 0 AND close_time > done_time, close_time - done_time, 0) AS done_to_close_timediff
FROM (
    -- 子查询:提取每个工单各状态的更新时间
    SELECT
        ticket_id,
        MAX(CASE WHEN status = 'OPEN' THEN gmt_update ELSE 0 END) AS open_time,
        MAX(CASE WHEN status = 'IN_PROGRESS' THEN gmt_update ELSE 0 END) AS in_progress_time,
        MAX(CASE WHEN status = 'DONE' THEN gmt_update ELSE 0 END) AS done_time,
        MAX(CASE WHEN status = 'CLOSE' THEN gmt_update ELSE 0 END) AS close_time
    FROM tiket_event
    GROUP BY ticket_id
) AS ticket_status_time

灵活调整状态对的方法

如果需要新增其他状态对的计算,只需要两步:

  1. 在内层子查询中新增对应状态的时间提取逻辑,已提取过的状态不需要重复添加
  2. 在外层SELECT中新增对应的差值计算逻辑即可,比如要新增IN_PROGRESS到DONE的时间差,只需要加如下代码:
IF(in_progress_time > 0 AND done_time > in_progress_time, done_time - in_progress_time, 0) AS inprogress_to_done_timediff

以上查询用示例数据运行后输出结果和需求完全一致。

内容的提问来源于stack exchange,提问作者uncle bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 17:36:06