SQL Server重复行

时间:2015-06-17 11:03:21

标签: sql sql-server

我有一张包含重复记录的表格。我想在另一列中标记记录是否重复,比如列名Flag。如果记录是重复标记,则在Flag列中标记为1,否则为0.

怎么做?

我可以使用查询来选择重复记录。

select 
    o.clientid, oc.dupeCount, o.pannodesc, o.CustNo
from 
    CustomerMaster1 o
inner join 
    (SELECT clientid, COUNT(*) AS dupeCount
     FROM CustomerMaster1
     WHERE ISNULL(PanNoDesc, '') <> ''
     GROUP BY clientid
     HAVING COUNT(*) > 1) oc ON o.clientid = oc.clientid

简单地说,如果有两个相似的记录,则在第二个重复的行上标记1,如果三个相似的记录将两个行标记为1,则将原始记录保留为0。

2 个答案:

答案 0 :(得分:3)

只需使用count(*)作为窗口函数来计算标志:

select o.clientid, oc.dupeCount, o.pannodesc, o.CustNo,
       (case when count(*) over (partition by clientId) > 1
             then 1 else 0
        end) as IsDuplicate
from CustomerMaster1 o;

如果您只关注某些记录,那么您可以改为计算它们:

select o.clientid, oc.dupeCount, o.pannodesc, o.CustNo,
       (case when sum(case when PanNoDesc <> '' or PanNoDesc is not null 
                           then 1 else 0
                      end) over (partition by clientId) > 1
             then 1 else 0
        end) as IsDuplicate
from CustomerMaster1 o;

编辑:

如果你想修改数据,假设你有一个标志,你可以将这些语句用作CTE:

with toupdate as (
      select o.clientid, oc.dupeCount, o.pannodesc, o.CustNo,
             (case when sum(case when PanNoDesc <> '' or PanNoDesc is not null 
                                 then 1 else 0
                            end) over (partition by clientId) > 1
                   then 1 else 0
              end) as NewIsDuplicate
      from CustomerMaster1 o
     )
update toupdate
    set Flag = NewIsDuplicate;

答案 1 :(得分:2)

您可以写为

CREATE TABLE CustomerMaster1 (clientid INT,PanNoDesc VARCHAR(10),DupFlag bit)
INSERT INTO CustomerMaster1 VALUES(1,'A',NULL ),(1,'B',NULL )


SELECT clientid,PanNoDesc,DupFlag  FROM CustomerMaster1

;WITH CTE AS( 
SELECT  clientid,           
        ROW_NUMBER()OVER (PARTITION BY clientid ORDER BY clientid ASC) AS rownum
FROM CustomerMaster1
WHERE ISNULL(PanNoDesc, '') <> ''
)
UPDATE T
SET T.DupFlag = (case WHEN rownum > 1 THEN 1 ELSE 0 END)
FROM CustomerMaster1 T
JOIN CTE ON CTE.clientid = T.clientid

SELECT clientid,PanNoDesc,DupFlag  FROM CustomerMaster1 

demo

编辑:根据提供的示例字段进行演示: http://sqlfiddle.com/#!3/4592f/1