每个时间段删除除最新行之外的所有行

时间:2014-02-22 06:41:20

标签: sql-server tsql

我想删除给定间隔的每个时间段内除最新行之外的所有行。例如,假设我每天都有一行两年,我选择月份作为给定的间隔。删除后,我将以24行结束,这是两年中每个月的最后一天。重要的是它的日历是对齐的,而不是相对于当前日期。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

DELETE DataToBeDeleted 
FROM 
(
   SELECT 
     SomeDate, 
     ROW_NUMBER() OVER (PARTITION BY Year(SomeDate), Month(SomeDate) 
                        ORDER BY SomeDate DESC) AS RankFromBack
   FROM DayData
) DataToBeDeleted
WHERE DataToBeDeleted.RankFromBack > 1;

SqlFiddle here

对于非月份期间,您需要调整分区和排序,以确保您对要保留的数据进行相应排名。

请注意,这也依赖于从单个表的投影中删除。