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)
所以基本上你只想为每个组保留一条记录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)
根据评论进行编辑: “假设当 type = 2 时,我想删除其他类型为 0 或 1 的匹配记录,所以这里有两个获胜。”