查找重复的行-保留一个条目

时间:2019-03-02 16:38:15

标签: sql-server

我有一个sql-server表,如下所示:

date : date
symbol : string
open : money
...

在收集历史数据的过程中,我可能不小心多次添加了给定日期的相同数据。我需要保留其中一行。但是需要删除给定日期上给定符号的多个条目。例如,这是错误的(INTC在2/2/2019有两个条目):

1/31/2019 INTC 48.32
2/2/2019 INTC 49.51
2/2/2019 INTC 49.51

如何针对每个符号通过sql script自动删除重复的行,而将不包含重复项的其余数据单独保留?

1 个答案:

答案 0 :(得分:2)

您可以使用一些CTE“魔术”:

WITH CTE AS(
    SELECT [date], [Symbol], [open],
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
    FROM YourTable
    WHERE [date] = '20190202'
      AND [Symbol] = 'INTC'
      AND [open] = 49.51)
DELETE FROM CTE
WHERE RN > 1;

如果您要DELETE创建的任何重复项,并假设重复项表示2行或更多行,它们共享datesymbol和{{1}的相同值},那么您可以这样做:

open

如果您每天仅应输入一个条目(或者可能是日期和符号),则将其创建为UNIQUE约束:

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;