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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:12:18