我在表格中有一些看起来大致如下的数据:
table stockData
(
tickId int not null,
timestamp datetime not null,
price decimal(18,5) not null
)
tickId和timestamp都不是唯一的,但tickId和timestamp的组合应该是唯一的。
我的表中有一些重复的数据,我正试图将其删除。但是,我得出的结论是,给定的数据没有足够的信息让我从另一行中辨别出一行,而且我基本上没办法删除其中一个重复的行。我的猜测是我需要引入某种标识列,这有助于我识别另一行。
这是正确的,还是有一些神奇的方法可以通过查询删除一个但不是两个重复数据?
编辑编辑以澄清tickId和timestamp组合应该是唯一的,但这不是因为重复的数据。
答案 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)