Sql 删除没有唯一标识符的重复行

Sql 删除没有唯一标识符的重复行,sql,sql-server,Sql,Sql Server,我在一个表中有一些数据,大致如下所示: table stockData ( tickId int not null, timestamp datetime not null, price decimal(18,5) not null ) tickId和timestamp都不是唯一的,但是tickId和timestamp的组合应该是唯一的 我的表中有一些重复数据,我正在尝试删除它。然而,我得出的结论是,对于给定的数据,没有足够的信息让我区分一行和另一行,并且基本上没有办法删除重复的行中的一行。我

我在一个表中有一些数据,大致如下所示:

table stockData
(
tickId int not null,
timestamp datetime not null,
price decimal(18,5) not null
)
tickId和timestamp都不是唯一的,但是tickId和timestamp的组合应该是唯一的

我的表中有一些重复数据,我正在尝试删除它。然而,我得出的结论是,对于给定的数据,没有足够的信息让我区分一行和另一行,并且基本上没有办法删除重复的行中的一行。我的猜测是,我需要引入某种标识列,这将帮助我识别一行和另一行

这是正确的,还是有什么神奇的方法可以通过查询删除一个而不是两个重复的数据

编辑编辑以澄清tickId和timestamp组合应该是唯一的,但这不是因为重复的数据。

选择distinct*从源表进入临时表将为您创建此表

从临时表格中删除您不需要的内容

insert into sorce_table
select * from temp_table

也许我没有正确理解您的问题,但如果tickId和timestamp保证是唯一的,那么您的表中如何有重复的数据?你能举一两个例子说明你的意思吗

但是,如果表中有所有三列的重复项,则以下脚本可能会起作用。请在实现之前测试并备份数据库,因为我刚刚把它放在一起

declare @x table 
(
    tickId int not null,
    timestamp datetime not null,
    price decimal(18,5) not null
)

insert into @x (tickId, timestamp, price)
select tickId,
    timestamp,
    price
from stockData
group by tickId,
         timestamp,
         price
having count(*) > 1

union 

select tickId,
       timestamp,
       price
from stockData
group by tickId,
         timestamp,
         price
having count(*) = 1

delete 
from stockData

insert into stockData (tickId, timestamp, price)
select tickId,
       timestamp,
       price
from @x

alter table stockData add constraint
    pk_StockData primary key clustered (tickid, timestamp)

下面是一个查询,它将删除重复项并为每个唯一行保留一个副本。它将与SQL Server 2005或更高版本配合使用:

WITH Dups AS
(
  SELECT tickId, timestamp, price,
    ROW_NUMBER() OVER(PARTITION BY tickid, timestamp ORDER BY (SELECT 0)) AS rn
  FROM stockData
)
DELETE FROM Dups WHERE rn > 1

只是一个想法,我不知道它是否有效或者是否会同时删除:从stackData中删除,其中tickId在SELECT tickId FROM stackData中;从SQLServer2005中,有一种神奇的方法可以只删除其中一个副本。您使用什么版本的SQL server?修复重复问题后,应向表中添加主键约束。谢谢Mikael,我正在使用SQL Server 2005。我确实有一个唯一的约束,但是我一直在将多个表中的数据合并到一个表中,并且这些表有重复的数据。我认为最简单的方法是将所有内容转储到一个表中,删除重复项,然后在后面添加约束。魔法查询由Sergey提供。很抱歉,我的意思是它应该是唯一的,但这不是因为重复数据。我会更新这个问题。哇,我以前从未见过这样的东西,但看起来很棒。我将阅读这篇文章并做一些测试,谢谢!第一个新手的回答很好:欢迎来到stackoverflow。