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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:52:21