我有一个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
自动删除重复的行,而将不包含重复项的其余数据单独保留?
答案 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行或更多行,它们共享date
,symbol
和{{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;