IT服务管理系统中多条件重复工单查询的SQL问题求助
IT服务管理系统工单筛选SQL问题解决
需求说明
需要筛选满足以下条件的工单:
- 工单类型为事件(Incident)
- 状态为开放(
Status NOT IN (6,16,17,18)) - 提交工单的用户存在另一张**相同问题类型(probcode)**的开放工单
现有问题
当前尝试的SQL语句会返回用户拥有多张开放工单但probcode不同的情况,无法精准匹配“同一用户+同一问题类型”的重复开放工单:
( SELECT Cust_ID FROM opencall WHERE callclass="Incident" AND Status NOT IN (6,16,17,18) GROUP BY Cust_id, probcode HAVING (COUNT(cust_id) > 1 AND COUNT(probcode) > 1) )
问题原因
原SQL的HAVING子句存在冗余:因为已经按Cust_id, probcode分组,每组内的probcode是完全相同的,COUNT(probcode) > 1没有实际筛选作用;同时仅返回Cust_ID无法关联到具体工单,也无法确保筛选出的是同一问题类型下的重复工单。
解决方案
方案1:子查询关联获取全量工单
先通过子查询找出存在“同一用户+同一问题类型”重复开放工单的组合,再关联原表获取所有符合条件的工单:
SELECT oc.* FROM opencall oc JOIN ( -- 找出有重复同一问题类型开放工单的用户+问题类型组合 SELECT Cust_ID, probcode FROM opencall WHERE callclass = 'Incident' AND Status NOT IN (6,16,17,18) GROUP BY Cust_ID, probcode HAVING COUNT(*) > 1 ) dup ON oc.Cust_ID = dup.Cust_ID AND oc.probcode = dup.probcode -- 再次过滤确保工单本身符合前两个条件 WHERE oc.callclass = 'Incident' AND oc.Status NOT IN (6,16,17,18)
方案2:窗口函数直接统计筛选
使用窗口函数COUNT(*) OVER (PARTITION BY Cust_ID, probcode)直接统计每个工单对应的“用户+问题类型”下的开放工单总数,再筛选总数大于1的记录:
SELECT * FROM ( SELECT *, -- 统计当前用户同一问题类型下的开放工单数量 COUNT(*) OVER (PARTITION BY Cust_ID, probcode) AS same_prob_open_count FROM opencall WHERE callclass = 'Incident' AND Status NOT IN (6,16,17,18) ) t WHERE same_prob_open_count > 1
内容的提问来源于stack exchange,提问作者Andy P James
相关产品推荐
相关产品推荐

