Sql server 查找重复行-保留一个条目
我有一个Sql server 查找重复行-保留一个条目,sql-server,Sql Server,我有一个sql server表,如下所示: date : date symbol : string open : money ... 在收集历史数据的过程中,我可能多次意外地添加了给定日期的相同数据。我需要保留其中一行。但在给定日期,给定符号的任何多个条目都需要删除。例如,这是错误的(2019年2月2日INTC的两个条目): 如何通过sql脚本自动删除每个符号的重复行,并保留不包含重复行的其余数据?您可以使用一些CTE“魔术”: 如果要删除所创建的任何重复项,并假设重复项表示两行或多行共享相同
sql server
表,如下所示:
date : date
symbol : string
open : money
...
在收集历史数据的过程中,我可能多次意外地添加了给定日期的相同数据。我需要保留其中一行。但在给定日期,给定符号的任何多个条目都需要删除。例如,这是错误的(2019年2月2日INTC的两个条目):
如何通过sql脚本自动删除每个符号的重复行,并保留不包含重复行的其余数据?您可以使用一些CTE“魔术”:
如果要删除所创建的任何重复项,并假设重复项表示两行或多行共享相同的日期
、符号
和打开
,则可以执行以下操作:
WITH CTE AS(
SELECT [date], [Symbol], [open],
ROW_NUMBER() OVER (PARTITION BY [date], [Symbol], [open] ORDER BY (SELECT NULL)) AS RN
FROM YourTable)
DELETE FROM CTE
WHERE RN > 1;
如果每天只能有一个条目(或者可能是日期和符号),则将其创建为唯一约束:
ALTER TABLE YourTable ADD CONSTRAINT UK_date_symbol UNIQUE ([date],symbol);
WITH CTE AS(
SELECT [date], [Symbol], [open],
ROW_NUMBER() OVER (PARTITION BY [date], [Symbol], [open] ORDER BY (SELECT NULL)) AS RN
FROM YourTable)
DELETE FROM CTE
WHERE RN > 1;
ALTER TABLE YourTable ADD CONSTRAINT UK_date_symbol UNIQUE ([date],symbol);