SQL查询 - 删除具有重复列值的行

NoB*_*Man 2 sql duplicates sql-server-2012

我需要能够删除表中的两列组合具有相同值的行.例如,在下面的样本表中,应该只有一个组合(48983,2018-05-01).

ID      CertID   DueDate
676790  48983   2018-05-03
678064  48983   2018-05-02
678086  48983   2018-05-01
678107  48983   2018-05-01
678061  48983   2018-05-01
Run Code Online (Sandbox Code Playgroud)

我试图获取重复条目的列表,但我得到的是整个表.这是我用过的:

WITH A   -- Get a list of unique combinations of ResponseDueDate and CertificateID
AS  (
   SELECT Distinct
          ID,       
          ResponseDueDate,
          CertID
   FROM  FacCompliance
)
,   B  -- Get a list of all those CertID values that have more than one ResponseDueDate associated
AS  (
    SELECT CertID
    FROM   A
    GROUP BY
           CertID
    HAVING COUNT(*) > 1
)
SELECT  A.ID,
        A.ResponseDueDate,
        A.FacCertificateID
FROM    A
    JOIN B
        ON  A.CertID = B.CertID
order by CertID, ResponseDueDate;
Run Code Online (Sandbox Code Playgroud)

我正在使用的查询有什么问题,是否可以删除额外的行(在上面的示例中,保留(48983,2018-05-01)组合的一个实例并删除其余的.我使用的是SQL Server 2016.

avb*_*avb 5

使用行号:

WITH A AS  (
   SELECT 
          ID,       
          ResponseDueDate,
          CertID,
          ROW_NUMBER() over (partition by CertID, ResponseDueDate order by ResponseDueDate) lp
   FROM  FacCompliance
)
delete a
where lp <> 1
;
Run Code Online (Sandbox Code Playgroud)

另外,如果ID是唯一的,你可以在没有窗口功能的情况下做到

delete fc
from  FacCompliance fc
where exists (
    select 1
    from FacCompliance ref
    where ref.ResponseDueDate = fc.ResponseDueDate
        and ref.CertID = fc.CertID
        and ref.ID < fc.ID
)
Run Code Online (Sandbox Code Playgroud)