首页 > 解决方案 > 删除最旧的重复项并按时间戳保留最新的重复项

问题描述

我有一个查询如下:

;WITH Duplicates AS 
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY ChannelName, SerialNumber, ReadingDate ORDER BY ChannelName) AS Rownumber
        FROM [Staging].[UriData]        
    )       
    DELETE FROM Duplicates WHERE Rownumber > 1
    --AND ROWNUMBER >=< ???
    OPTION (MAXRECURSION 0)

这很好用,可以在表中找到重复项。但是,该表经常使用更正的数据进行更新。

到查询运行时,可能已经有三个或更多更新。

这意味着我想删除除最新记录之外的所有记录。表中有一个时间戳字段,表示最近一次插入发生的时间。我假设我应该使用此字段来确定哪一行是最新行,而任何不是最高行号的行,都将其删除。这是正确的方法吗?

TIA

标签: sqlsql-servercommon-table-expression

解决方案


当然,您可以使用timestampcolumn with ROW_NUMBER()& 您不需要使用递归提示,因为您CTE没有任何递归级别。

;WITH Duplicates AS  (
       SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY ChannelName, SerialNumber, ReadingDate ORDER BY timestamp DESC) AS Rownumber
       FROM [Staging].[UriData]        
 ) 

DELETE d
FROM Duplicates d
WHERE Rownumber > 1;

推荐阅读