如何统计团队成员最后处理的工单数量?修复SQL统计异常
问题分析与SQL修正
原SQL的核心问题
- 逻辑运算符优先级错误:WHERE子句中
AND优先级高于OR,导致只有第一个成员(Ana Monteiro)的记录会校验c.status_id IN(50,60,65),其他成员的记录直接绕过状态校验,统计了非解决状态的工单。 - 工单归属逻辑混乱:
DISTINCT ON(a.ticket_id)和GROUP BY a.ticket_id, b.name混用,会导致同一工单若被多个成员处理过,会生成多条记录,最终统计时可能重复计数,且无法确保归属到真正解决工单的成员。
修正后的SQL
SELECT vgtuser, COUNT(*) AS resolved_tickets FROM ( SELECT b.name AS vgtuser, a.ticket_id, ROW_NUMBER() OVER ( PARTITION BY a.ticket_id ORDER BY a.updated_on DESC ) AS rn FROM ticket_messages a INNER JOIN admins b ON a.admin_id = b.admin_id INNER JOIN ticket_status_history c ON a.ticket_id = c.ticket_id WHERE c.status_id IN(50, 60, 65) AND a.updated_by IN ( 'Ana Monteiro', 'Nuno Gonçalves', 'Henrique Espinha', 'Ricardo Sousa', 'João Fernandes', 'Pedro Pereira', 'Luis Moreno', 'Gonçalo Rodrigues', 'Nuno Coelho' ) ) AS ranked_tickets WHERE rn = 1 -- 只保留每个工单最新处理的记录 GROUP BY vgtuser ORDER BY resolved_tickets DESC;
关键修正点
- 修复逻辑条件:用
IN替代多个LIKE(精确匹配场景更高效),确保成员筛选和状态校验同时生效。 - 窗口函数锁定归属:用
ROW_NUMBER()按工单分组、更新时间倒序排序,取每个工单的第一条记录(最新操作),确保每个工单只被统计一次,且归属到最后处理(即真正解决)的成员。 - 去除冗余语法:删掉
DISTINCT ON和max(a.updated_on),用窗口函数更清晰地实现工单归属逻辑。
内容的提问来源于stack exchange,提问作者Hugo Hora
相关产品推荐
相关产品推荐

