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

如何编写SQL查询检测同一ID同时存在open和closed状态的重复记录?

SQL重复数据检测方案

核心需求

需要检测两类违规情况:

  1. 同一customerID(结合customernumber)同时存在open和closed状态的记录
  2. 同一customerID(结合customernumber)存在多条open状态的记录(匹配你原始代码的检测逻辑)

方案一:聚合统计一次性覆盖两种情况

通过聚合函数统计各状态的记录数,直接筛选出违规的客户数据:

SELECT
    customerID,
    customernumber,
    SUM(CASE WHEN Status = 'open' THEN 1 ELSE 0 END) AS open_record_count,
    SUM(CASE WHEN Status = 'closed' THEN 1 ELSE 0 END) AS closed_record_count,
    COUNT(DISTINCT orderid) AS unique_order_count
FROM 
    test.dbo
GROUP BY 
    customerID, customernumber
HAVING 
    -- 条件1:同时存在open和closed状态
    (open_record_count > 0 AND closed_record_count > 0)
    -- 条件2:存在多条open状态记录
    OR open_record_count > 1

方案二:针对性验证“有open的客户是否存在closed记录”

如果仅需验证已存在open记录的客户是否同时有closed记录,可以用EXISTS子查询结合原始逻辑:

SELECT
    customerID,
    customernumber,
    COUNT(DISTINCT orderid) AS open_order_count
FROM 
    test.dbo o
WHERE
    Status = 'open'
    AND EXISTS (
        SELECT 1 
        FROM test.dbo c 
        WHERE c.customerID = o.customerID 
          AND c.customernumber = o.customernumber 
          AND c.Status = 'closed'
    )
-- 可选:保留原始条件,筛选同时有多条open和存在closed的客户
-- HAVING COUNT(DISTINCT orderid) > 1
GROUP BY 
    customerID, customernumber

方案三:自关联查询快速定位跨状态重复

直接通过自关联匹配同一客户的不同状态记录:

SELECT DISTINCT
    o.customerID,
    o.customernumber
FROM 
    test.dbo o
JOIN 
    test.dbo c ON o.customerID = c.customerID AND o.customernumber = c.customernumber
WHERE 
    o.Status = 'open' 
    AND c.Status = 'closed'

内容的提问来源于stack exchange,提问作者GreyFox9881

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:22:43