在2列的条件下从SQL Server删除重复值

时间:2018-09-26 11:18:07

标签: sql sql-server tsql

|Rownumber  |OldIdassigned  |commoncode  |
------------------------------------------
| 1         |FLEX           |Y2573F102   |
------------------------------------------
| 2         |RCL            |Y2573F102   |
------------------------------------------
| 3         |FLEX           |Y2573F102   |
------------------------------------------
| 4         |QGEN           |N72482123   |
------------------------------------------
| 5         |QGEN           |N72482123   |
------------------------------------------
| 6         |QGEN           |N72482123   |
------------------------------------------
| 7         |RACE           |N72482123   |
------------------------------------------
| 8         |CLB            |N22717107   |
------------------------------------------
| 9         |CLB            |N22717107   |
------------------------------------------
<b>| 10     |CLB            |N22717107   |


我需要根据通用代码和以下条件删除重复记录:-如果oldidassigned是相同的,则删除,否则不要删除。

例如,Y2573F102具有3个重复的记录行1,2,3...。1,2不需要删除,只需删除第3行。

5 个答案:

答案 0 :(得分:5)

为此,我喜欢可更新的CTE和窗口功能:

with todelete as (
      select t.*,
             row_number() over (partition by commoncode order by rownumber) as seqnum
      from t
     )
delete todelete
    where seqnum > 1;

答案 1 :(得分:2)

使用窗口函数row_number,根据您的描述和注释,您似乎需要更改分区子句

delete t
from
(select t1.*,row_number() over(partition by commoncode order by  Rownumber) rn from table t1
)t where rn<>1

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=eacc0688efb534a0addee68678f323fe

答案 2 :(得分:2)

使用ROW_NUMBER()

DELETE t
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY OldIdassigned, commoncode ORDER BY rownumber) AS Seq
      FROM table t
     ) t
WHERE t.seq > 1;

编辑:如果只想检查基于commoncode的重复项,则从OldIdassigned子句中删除PARTITION

DELETE t
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY commoncode ORDER BY rownumber DESC) AS Seq
      FROM table t
     ) t
WHERE t.seq > 1; 

答案 3 :(得分:2)

使用Row_Number()

delete t from 
(select *, row_number() over(partition by commoncode order by 
 rownumber) as rn) t 
 where rn<>1

答案 4 :(得分:1)

由于所有答案都是相似的(并且是正确的),所以我将发布一种替代方式:

DELETE FROM TableA
WHERE EXISTS ( SELECT * FROM TableA AS A2
               WHERE A2.commoncode = TableA.commoncode
                 AND A2.OldIdassigned = TableA.OldIdassigned
                 AND A2.Rownumber < TableA.Rownumber )