SQL问题:如何根据ticket_ID筛选最新记录统计未解决工单
解决方法
要解决重复ticket_ID导致统计错误的问题,核心是先筛选出每个ticket_ID对应的最新记录,再基于这些记录统计未解决工单数量,以下是两种常用实现方式:
方法一:使用窗口函数(推荐,适用于支持窗口函数的数据库)
利用ROW_NUMBER()窗口函数对每个ticket_ID的记录按last_updated_time降序排序,标记出最新的那条记录(排序值为1),再筛选出这些记录进行统计:
SELECT Type, SUM(CASE WHEN Status IN ('Open', 'Pending') THEN 1 ELSE 0 END) AS Unresolved FROM ( SELECT ticket_ID, last_updated_time, Type, Status, ROW_NUMBER() OVER (PARTITION BY ticket_ID ORDER BY last_updated_time DESC) AS rn FROM "dl_refined_wireless_freshdesk"."ticket" ) t WHERE rn = 1 -- 只保留每个ticket_ID的最新记录 GROUP BY Type ORDER BY Type ASC;
说明:
PARTITION BY ticket_ID:按ticket_ID分组,每组单独排序ORDER BY last_updated_time DESC:组内按更新时间倒序,最新的记录排在最前面rn = 1:筛选出每组的第一条(即最新)记录
方法二:子查询关联(兼容不支持窗口函数的老版本数据库)
先通过子查询获取每个ticket_ID的最大更新时间,再关联原表筛选出对应记录,最后统计:
SELECT t.Type, SUM(CASE WHEN t.Status IN ('Open', 'Pending') THEN 1 ELSE 0 END) AS Unresolved FROM "dl_refined_wireless_freshdesk"."ticket" t INNER JOIN ( SELECT ticket_ID, MAX(last_updated_time) AS max_update_time FROM "dl_refined_wireless_freshdesk"."ticket" GROUP BY ticket_ID ) latest ON t.ticket_ID = latest.ticket_ID AND t.last_updated_time = latest.max_update_time GROUP BY t.Type ORDER BY t.Type ASC;
说明:
- 子查询
latest先找出每个ticket_ID的最新更新时间 - 通过
INNER JOIN关联原表,只保留更新时间等于最新时间的记录
为什么你之前的WHERE MAX(last_updated_time)不生效?
MAX()属于聚合函数,只能用在SELECT或HAVING子句中,无法直接放在WHERE里过滤行——WHERE是用来筛选原始行的,而聚合函数是基于分组后的结果计算的,逻辑顺序不匹配,所以必须先通过子查询或窗口函数筛选出符合条件的行,再进行统计。
内容的提问来源于stack exchange,提问作者What_is_data
相关产品推荐
相关产品推荐

