我的表中有一些重复的行。我想只删除一个重复的行。
例如,我有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行
我该怎么做?
答案 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)
由于我没有架构,我可以采取一些可能的解决方案:
编辑:
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 |
+-----+----------------+