求SQL查询语句:将ticket_audit表汇总为指定聚合表
解决方案
可以使用条件聚合实现需求,通过GROUP BY按工单ID分组,结合SUM(CASE...)分别计算不同状态的总时长,同时用MIN(datetime)获取每个工单的最早时间戳:
SELECT MIN(datetime) AS datetime, agent, ticket_id, SUM(CASE WHEN status = 'waiting' THEN duration ELSE 0 END) AS waiting_duration, SUM(CASE WHEN status = 'respond' THEN duration ELSE 0 END) AS respond_duration, SUM(CASE WHEN status = 'validation' THEN duration ELSE 0 END) AS validation_duration FROM ticket_audit GROUP BY ticket_id, agent ORDER BY datetime;
语句说明
MIN(datetime):提取每个ticket_id对应的最早时间戳,匹配输出要求。GROUP BY ticket_id, agent:由于每个工单的处理代理唯一(示例数据可见),同时按这两个字段分组,保证每个工单仅返回一行结果。SUM(CASE...):通过条件判断,仅当状态匹配时累加duration,否则计入0,直接处理了部分工单无对应状态的场景,避免返回NULL。ORDER BY datetime:按工单最早时间排序,与示例输出顺序一致。
验证结果
将上述语句应用到提供的ticket_audit表中,会得到与期望完全一致的输出:
| datetime | agent | ticket_id | waiting_duration | respond_duration | validation_duration |
|---|---|---|---|---|---|
| 9/1/24 5:47:43 PM | john | 1001 | 8 | 11 | 15 |
| 9/1/24 5:47:48 PM | mary | 1002 | 7 | 45 | 53 |
| 9/2/24 12:04:39 AM | dave | 1003 | 10 | 39 | 54 |
| 9/2/24 12:04:39 AM | john | 1004 | 18 | 0 | 0 |
| 9/2/24 12:04:39 AM | mary | 1005 | 11 | 15 | 0 |
内容的提问来源于stack exchange,提问作者CWZY
相关产品推荐
相关产品推荐

