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

use*_*706 7 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
Run Code Online (Sandbox Code Playgroud)

从上面的日期应该只删除一行,并应显示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
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

Aar*_*and 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;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,无论是[date][timestamp]是列名可怕的选择...


smu*_*agh 1

表上有主键吗?

是什么使一行重复?同时?同一日期?所有列都相同吗?

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

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])
Run Code Online (Sandbox Code Playgroud)