sql查询只删除一个重复的行

时间:2012-06-20 15:19:43

标签: sql-server

我的表中有一些重复的行。我想只删除一个重复的行。

例如,我有9个重复的行,所以应该只删除一行,并且应该显示剩余的8行。

例如

日期调用称为持续时间时间戳

2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121

从上面的日期应该只删除一行,并且应该显示3行

2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100

从上面的日期应该只删除一行,并且应该显示2行

我该怎么做?

6 个答案:

答案 0 :(得分:8)

此解决方案允许您从每组重复项中删除一行(而不是一次只处理一个重复项块):

;WITH x AS 
(
  SELECT [date], rn = ROW_NUMBER() OVER (PARTITION BY 
    [date], calling, called, duration, [timestamp]
    ORDER BY [date])
  FROM dbo.UnspecifiedTableName
)
DELETE x WHERE rn = 2;

另外,[date][timestamp]都是列名称的糟糕选择......

答案 1 :(得分:2)

对于SQL Server 2005+,您可以执行以下操作:

;WITH CTE AS
(
    SELECT  *, 
            ROW_NUMBER() OVER(PARTITION BY [date], calling, called, duration, [timestamp] ORDER BY 1) RN
    FROM YourTable
)
DELETE FROM CTE
WHERE RN = 2

答案 2 :(得分:1)

桌上有主键吗?

是什么让一行重复?同时?同一天?所有列都一样吗?

如果你有一个主键,你可以使用TOP功能只选择一个记录并删除那一行:

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])

答案 3 :(得分:1)

如果你不介意这些行的顺序,那么在MySQL中有一个命令:

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5};

答案 4 :(得分:-1)

由于我没有架构,我可以采取一些可能的解决方案:

  1. 将行号应用于所有列的选择
  2. 使用这些列创建一个组并删除每个组中的min(rownumber)
  3. 编辑:

    rownumber在内部查询中,并且rownumber将在所有行中递增。在外部查询中,我通过内部查询创建组,并为每个组选择min(rownumber)。由于每个组由重复的行组成,因此我删除每个组的min(rownumber)。

答案 5 :(得分:-1)

使用LIMIT 1将有助于您仅删除与1 ROW查询匹配的DELETE

DELETE FROM `table_name` WHERE `column_name`='value' LIMIT 1;

<强> BEFORE

+----------------------+
| id  |  column_name   |
+-----+----------------+
| 1   |  value         |
+-----+----------------+
| 2   |  value         |
+-----+----------------+
| 3   |  value         |
+-----+----------------+
| 4   |  value         |
+-----+----------------+

<强> AFTER

+----------------------+
| id  |  column_name   |
+-----+----------------+
| 1   |  value         |
+-----+----------------+
| 2   |  value         |
+-----+----------------+
| 3   |  value         |
+-----+----------------+