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

时间:2012-03-25 18:05:51

标签: sql sql-server

我在表格中有一些看起来大致如下的数据:

table stockData
(
tickId int not null,
timestamp datetime not null,
price decimal(18,5) not null
)

tickId和timestamp都不是唯一的,但tickId和timestamp的组合应该是唯一的。

我的表中有一些重复的数据,我正试图将其删除。但是,我得出的结论是,给定的数据没有足够的信息让我从另一行中辨别出一行,而且我基本上没办法删除其中一个重复的行。我的猜测是我需要引入某种标识列,这有助于我识别另一行。

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

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

3 个答案:

答案 0 :(得分:27)

这是一个查询,它将删除重复项并保留每个唯一行的一个副本。它适用于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

答案 1 :(得分:3)

select distinct * into temp_table from source_table(此表格将为您创建)

从temp_table中删除(你不需要的)

insert into sorce_table
select * from temp_table

答案 2 :(得分:0)

也许我没有正确理解你的问题,但如果“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)