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);