仅根据sql server中的条件删除重复记录

Eti*_*nne 0 sql t-sql sql-server

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

这是我的桌子

ID、名称、记录号、类型
--------------------------
1, 测试, 123, 0
2、测试, 123, 1
3、测试2、321、0
4、测试2、321、0

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

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

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

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
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle Demo

根据评论进行编辑: “假设当 type = 2 时,我想删除其他类型为 0 或 1 的匹配记录,所以这里有两个获胜。”