T-SQL删除多个列重复项,保留最新的一个

时间:2016-07-22 10:21:04

标签: tsql duplicates

我遇到了问题,并没有类似的选项有效,或者无法解决这个问题:)

我有一个庞大的数据表,其中包含多个基于多列的重复项(不同数量的重复项)。

Table1
id (primary key)
col1
col2
col3
col4 
... 

我关心的是col1,col2,col3:

这些是重复的:

SELECT 
, t.id
, t.col1
, t.col2
, t.col3
, count(*) AS 'Times duplicated' 
FROM      Table1 t
GROUP BY t.col1, t.col2, t.col3
HAVING count(*) > 1 
ORDER BY r.col1

如何只删除重复项但保留最新版本(我可以使用max(id)作为最新版本)?

P.S。 cols也可以包含null - 2个空值被视为等于)

1 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER()在其唯一的t.col1, t.col2, t.col3组(其中1是最新的)中对1 - n中的每条记录进行排名,然后只删除行号大于1的所有记录:

DELETE  t
FROM    (   SELECT  t.*,
                    RowNum = ROW_NUMBER() OVER(PARTITION BY t.col1, t.col2, t.col3 
                                                ORDER BY t.ID DESC)
            FROM    Table1 AS t
        ) AS t
WHERE   RowNum > 1;