删除重复项,保留其中一项,按分组

时间:2019-01-07 16:41:40

标签: sql sql-server

我需要删除每个表ID的所有重复项,除了一个。像下面这样。我需要删除01,02,03的valueid上的所有重复项...

原文:

id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
01      | 1001      |   datadata1
02      | 1323      |   datamoredata123
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

应以

结尾
id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

试图用类似的方法做到这一点,但我不知道如何对ID上的删除分组

WITH CTE AS(
   SELECT valueid,
       RN = ROW_NUMBER()OVER(PARTITION BY valueid ORDER BY valueid)
   FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1

有什么建议吗?

预先感谢

3 个答案:

答案 0 :(得分:3)

您非常接近。您需要更改partition by子句。您希望每对id / valueid中有一行,因此它们都应该在partitioning子句中:

WITH todelete AS (
   SELECT valueid,
       RN = ROW_NUMBER() OVER (PARTITION BY id, valueid ORDER BY data)
   FROM tblvalues
)
DELETE FROM todelete WHERE RN > 1;

答案 1 :(得分:3)

您需要将id列添加到PARTITION

WITH CTE AS(
   SELECT valueid,
       RN = ROW_NUMBER()OVER( PARTITION BY id, valueid ORDER BY data)
   FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1

这样,您将分别为每个valueid删除重复的id值。 data列确定删除哪些重复项。

答案 2 :(得分:-1)

一种非常简单的方法是在(valueid)列中添加UNIQUE索引。编写ALTER语句时,请指定IGNORE关键字。

ALTER IGNORE TABLE tblvalues
ADD UNIQUE INDEX idx_name (valueid);

这将删除所有重复的行。另外一个好处是,将来重复的INSERT将是错误的。与往常一样,您可以在运行类似的操作之前进行备份。