如何优化SQL查询确保first_serv_time晚于Ticket_entry_Time?
解决客户支持工单的服务时间筛选与聚合问题
你的原SQL未过滤掉Serv_doc_time小于等于Ticket_entry_Time的记录,导致计算出的first_serv_time可能不符合要求。以下是几种基于分区/条件聚合的调整方案,适配不同需求:
方案1:仅保留有有效服务记录的工单
如果只需要展示存在Serv_doc_time > Ticket_entry_Time记录的工单,直接在查询中加入过滤条件后聚合即可:
SELECT customer_id, ticket, ticket_entry_time, MIN(serv_doc_time) AS first_serv_time, MAX(serv_doc_time) AS last_serv_time FROM your_table WHERE serv_doc_time > ticket_entry_time GROUP BY customer_id, ticket, ticket_entry_time;
方案2:保留所有工单(含无有效服务记录的)
如果需要展示所有工单,对无符合条件服务记录的工单,first_serv_time和last_serv_time显示为NULL,可以用条件聚合实现:
SELECT customer_id, ticket, ticket_entry_time, -- 仅计算大于工单创建时间的最小服务时间 MIN(CASE WHEN serv_doc_time > ticket_entry_time THEN serv_doc_time END) AS first_serv_time, -- 仅计算大于工单创建时间的最大服务时间 MAX(CASE WHEN serv_doc_time > ticket_entry_time THEN serv_doc_time END) AS last_serv_time FROM your_table GROUP BY customer_id, ticket, ticket_entry_time;
方案3:用窗口函数精细控制排序逻辑
如果需要确保first_serv_time是工单中第一条符合条件的服务记录(比如存在相同时间的记录需按其他维度排序),可以用窗口函数先标记有效记录的顺序,再聚合:
WITH ranked_records AS ( SELECT *, -- 按服务时间升序标记符合条件的记录 ROW_NUMBER() OVER ( PARTITION BY customer_id, ticket, ticket_entry_time ORDER BY serv_doc_time ASC ) AS asc_rank, -- 按服务时间降序标记符合条件的记录 ROW_NUMBER() OVER ( PARTITION BY customer_id, ticket, ticket_entry_time ORDER BY serv_doc_time DESC ) AS desc_rank FROM your_table WHERE serv_doc_time > ticket_entry_time ) SELECT customer_id, ticket, ticket_entry_time, MAX(CASE WHEN asc_rank = 1 THEN serv_doc_time END) AS first_serv_time, MAX(CASE WHEN desc_rank = 1 THEN serv_doc_time END) AS last_serv_time FROM ranked_records GROUP BY customer_id, ticket, ticket_entry_time;
方案说明
- 方案1最简洁,适合只关注有有效服务记录的场景;
- 方案2保留所有工单数据,无需额外子查询,性能较好;
- 方案3通过窗口函数支持更复杂的排序规则,比如需要按其他字段(如服务类型)确定"第一条"记录时,可修改
ORDER BY子句。
内容的提问来源于stack exchange,提问作者snalmznh
相关产品推荐
相关产品推荐

