如何删除重复的行

时间:2015-11-13 15:51:20

标签: sql duplicates

某些行共享相同的主键(ID),但行的其余部分可能不同。例如

ID   Age   Info
2    21    2763
2    21    6276
3    31    82756

在这种情况下,第一行和第二行都具有相同的ID和年龄,但信息不同。我想要做的重复ID行是随机保留其中一行并删除其他行。我的数据集中有这么多这样的记录,所以我不能一个一个地删除它们。有什么解决方案吗?感谢

4 个答案:

答案 0 :(得分:1)

试试这个:

DELETE t1
FROM mytable AS t1
INNER JOIN mytable AS t2 
ON t1.ID = t2.ID AND t1.Age = t2.Age AND t1.Info > t2.Info

以上应该适用于MySQL,SQL Server。该语句删除(ID, Age)切片中的所有行,但具有最小Info值的行。

注意:上述工作规定Info值对于(ID, Age)切片是唯一的。

答案 1 :(得分:1)

使用窗口功能:

;with cte as(select *, row_number() over(partition by id order by info) rn 
             from table)
delete from cte where rn <> 1

答案 2 :(得分:0)

我认为你正在寻找这样的东西:

jsonTabInfo

首先尝试选择语句以确保它返回正确的行,然后将删除部分添加到其中

答案 3 :(得分:0)

我会建议一个基于集合的解决方案,但我无法处理所有3行相同的行。因此,建议使用ROWCOUNT和while循环的解决方案。 ROWCOUNT将确保一次只删除1条记录。 while循环是为了让您不必逐个手动完成。

SET ROWCOUNT 1

DECLARE @ctr INT
SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
SELECT @ctr
WHILE @ctr > 1
BEGIN
    DELETE FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1)
    SELECT @ctr = NULL
    SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
If @Ctr IS NULL
    Break
ELSE
    Continue
END
SET ROWCOUNT 0

您可以更改delete语句中的order by子句以满足您的要求。