仅在sql server中的条件下删除重复记录

时间:2014-10-20 20:23:07

标签: sql sql-server tsql

我想删除重复项,例如我想要删除此行“Test2,321,0”,因为有重复项,但在第1行和第2行中我只想删除第二行,因为类型ID高于第一行中的当前副本。

这是我的表

ID, Name, RecordNum, Type
--------------------------
1, Test, 123, 0
2, Test, 123, 1
3, Test2, 321, 0
4, Test2, 321, 0

我可以使用此查询删除第4行中的重复项。但我似乎无法弄清楚如何删除第2行,因为第1行是相同的但类型编号更低。如果类型编号为2则会获胜,您必须删除任何具有0和1类型编号且具有相同名称和recordnum的重复项。

WITH dup2 as ( 
  SELECT Name
       , RecordNum
       , Type ROW_NUMBER() OVER(PARTITION BY Name, RecordNum, Type ORDER BY ID ASC) AS NumOfDups 
    FROM MyTbale) 
  delete FROM dup2 WHERE NumOfDups > 1

1 个答案:

答案 0 :(得分:3)

所以基本上你只想为每个Name, RecordNum组保留一条记录。如果Type相同,则仅保留最低ID,如果Type不同,请保留最低类型:

WITH dup2 AS 
( 
         SELECT  NAME, 
                 RecordNum, 
                 NumOfDups = ROW_NUMBER()OVER(
                                 PARTITION BY NAME, RecordNum 
                                 ORDER BY CASE WHEN Type=2 THEN 0 ELSE 1 END, Type, Id)
         FROM    MyTbale) 
DELETE 
FROM   dup2 
WHERE  NumOfDups > 1

SQL-Fiddle Demo

根据评论

编辑"当类型= 2时,我想删除其他匹配记录,其中类型为零或一,所以两个胜利这里"