7

我有一张表,里面有一些重复的行。我只想删除一个重复的行。

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

例子

日期调用称为持续时间 timestampp

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 行

我怎样才能做到这一点?

4

6 回答 6

9

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

;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]都是列名的糟糕选择......

于 2012-06-20T15:46:28.970 回答
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
于 2012-06-20T15:46:02.113 回答
1

你的桌子上有主键吗?

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

如果您有一个主键,您可以使用 TOP 函数仅选择一条记录并删除该行:

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])
于 2012-06-20T15:24:02.770 回答
1

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

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5};
于 2012-06-20T15:25:09.887 回答
-1

由于我没有架构,因此我可能会分步解决:

  1. 将行号应用于所有列的选择
  2. 使用这些列进行分组并删除每个组中的 min(rownumber)

编辑:

行号在内部查询中,并且行号在所有行中都会递增。在外部查询中,我对内部查询进行分组,并为每个组选择 min(rownumber)。由于每个组都由重复的行组成,因此我删除了每个组的 min(rownumber)。

于 2012-06-20T15:47:13.070 回答
-1

usingLIMIT 1将帮助您仅删除1 ROW与您的DELETE查询匹配的内容:

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         |
+-----+----------------+
于 2016-12-31T01:25:53.947 回答