SQL识别重复和更新

时间:2016-09-24 16:37:56

标签: sql-server

我需要以下问题的帮助。我有一个客户表CustA,它有custid,名字,姓氏,phone1,phone2,lastupdateddate列。此表具有重复记录。

时,记录在CustA表中被视为重复
first name & surname & (phone1 or phone2) is duplicated  
 custid firstname surname phone1 phone2 lastupdateddate

 1000       Sam      Son      334566   NULL   1-jan-2016
 1001       sam      son      NULL   334566   1-feb-2016

我已经将cte用于这个场景,以基于rownumber的firstname,lastname,phone1,phone2进行分区。但OR条件仍然是CTE查询中phone1或phone2的挑战。请分享你的想法。欣赏它。

2 个答案:

答案 0 :(得分:1)

这里的诀窍是COALESCE

With cte as
(
select Count()over(partition by firstname, lastname, coalesce(phone1, phone2)) as cnt,*
From yourtable
) 
Select * from CTE 
WHere cnt > 1

虽然如果不是一个总是为null的情况您可以使用CASE表达式来确保以一致的顺序显示值。

WITH cte
     AS (SELECT COUNT(*)
                  OVER(
                    partition BY firstname, 
                                 lastname, 
                                 CASE WHEN phone1 < phone2 THEN phone1 ELSE phone2 END, 
                                 CASE WHEN phone1 < phone2 THEN phone2 ELSE phone1 END) AS cnt,
                *
         FROM   yourtable)
SELECT *
FROM   CTE
WHERE  cnt > 1 

答案 1 :(得分:0)

这个也会给你一个dupes列表(可选custid&lt;&gt; A.custid)

Declare @Yourtable table (custid int,firstname varchar(50),surname varchar(50),phone1 varchar(25),phone2 varchar(25),lastupdate date) 
Insert into @Yourtable values 
(1000,'Sam','Son'  ,'334566',NULL    ,'1-jan-2016'),
(1001,'sam','son'  ,NULL    ,'334566','1-feb-2016'),
(1003,'sam','son'  ,NULL    ,NULL    ,'2-feb-2016'),
(1002,'Not','ADupe',NULL    ,NULL    ,'1-feb-2016')

Select A.*
      ,B.Dupes 
 From  @YourTable A
 Cross Apply (Select Dupes=(Select Stuff((Select Distinct ',' + cast(custid as varchar(25)) 
                              From @YourTable 
                              Where custid<>A.custid
                                and firstname=A.firstname 
                                and surname  =A.surname 
                                and (IsNull(A.phone1,'') in (IsNull(phone1,''),IsNull(phone2,'')) or IsNull(A.phone2,'') in (IsNull(phone1,''),IsNull(phone2,'')) ) 
                                For XML Path ('')),1,1,'')
                            )
              ) B
 Where Dupes is not null

返回

custid  firstname   surname phone1  phone2  lastupdate  Dupes
1000    Sam         Son     334566  NULL    2016-01-01  1001,1003
1001    sam         son     NULL    334566  2016-02-01  1000,1003
1003    sam         son     NULL    NULL    2016-02-02  1000,1001