Sql server 仅删除一个重复行的sql查询
我有一张表,里面有一些重复的行。我只想删除一个重复的行 例如,I'v 9个重复行,因此应仅删除一行,并应显示剩余的8行 范例 称为持续时间timestamp的日期调用Sql server 仅删除一个重复行的sql查询,sql-server,Sql Server,我有一张表,里面有一些重复的行。我只想删除一个重复的行 例如,I'v 9个重复行,因此应仅删除一行,并应显示剩余的8行 范例 称为持续时间timestamp的日期调用 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 15
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
从上述日期开始,应仅删除一行,并应显示两行
我该怎么做?表上有主键吗 什么使一行重复?同一时间?同一天?所有列都相同吗 如果您有主键,则可以使用TOP功能仅选择一条记录并删除该行:
Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])
如果您不介意这些行的顺序,MySQL中有一个命令:
DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5};
对于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
此解决方案允许您从每组副本中删除一行(而不是一次只处理单个副本块):
另外,对于列名来说,
[date]
和[timestamp]
都是糟糕的选择…由于我没有模式,我想分步骤找到一个可能的解决方案:
rownumber位于内部查询中,所有行中的rownumber都将递增。在外部查询中,我使用内部查询的group by并为每个组选择min(行编号)。由于每个组都由重复的行组成,因此我会删除每个组的最小值(行数)。使用
LIMIT 1
将帮助您仅删除与delete
查询匹配的1行
:
DELETE FROM `table_name` WHERE `column_name`='value' LIMIT 1;
之前:+----------------------+
| id | column_name |
+-----+----------------+
| 1 | value |
+-----+----------------+
| 2 | value |
+-----+----------------+
| 3 | value |
+-----+----------------+
| 4 | value |
+-----+----------------+
之后:
+----------------------+
| id | column_name |
+-----+----------------+
| 1 | value |
+-----+----------------+
| 2 | value |
+-----+----------------+
| 3 | value |
+-----+----------------+
请格式化数据,使其更易于阅读。列出了五列名称,但输出中有六列。最后一列是如何从121变为100的?如果源有两行121和两行100,您会删除两行还是一行?(换句话说,是否仅基于日期进行复制?)当然,您可以使用NEWHERE语句指定要删除的日期。如果按相同的列进行分区,则请求SQL Server solution.MIN的OP对于每个组始终为1。这意味着您还将删除不具有重复项的行,除非您还添加了具有重复项的行。这使得它比已经发布的解决方案更加复杂,IMHO。@AaronBertrand nop,rownumber在一个内部查询中,所有行的rownumber都会递增。在外部查询中,我使用内部查询的group by并为每个组选择min(行编号)。因为每个组都是由重复的行组成的,所以我删除了每个组的min(rownumber)。你明白吗?有更好的描述,当然,但与你的第一个描述不符。代码会更有用,更容易解释;当x为@User6675636b20796f7521时,它被称为a。
+----------------------+
| id | column_name |
+-----+----------------+
| 1 | value |
+-----+----------------+
| 2 | value |
+-----+----------------+
| 3 | value |
+-----+----------------+