Sql server 如何为每个项目清除早于第n个版本的项目版本

Sql server 如何为每个项目清除早于第n个版本的项目版本,sql-server,tsql,sql-delete,Sql Server,Tsql,Sql Delete,我想从下面的示例表中清除行,以便表中保留每个报表的三个最新版本(按名称) ReportID是唯一标识符。对于每个名称,样本中的记录按CreateDate降序排序 这可以在T-SQL查询中完成,还是需要设置游标并以某种方式遍历表 CREATE TABLE #Reports ( [ReportID] int , [Name] varchar(50) , [CreateDate] datetime); INSERT INTO #Reports (ReportID, [Name

我想从下面的示例表中清除行,以便表中保留每个报表的三个最新版本(按名称)

ReportID是唯一标识符。对于每个名称,样本中的记录按CreateDate降序排序

这可以在T-SQL查询中完成,还是需要设置游标并以某种方式遍历表

CREATE TABLE #Reports (
    [ReportID] int
    , [Name] varchar(50)
    , [CreateDate] datetime);

INSERT INTO #Reports (ReportID, [Name], CreateDate)
VALUES (3255, '2018 FTR RE Budget Acceptance Report', '2017-12-28 22:33:28.587'),
(3243, '2018 FTR RE Budget Acceptance Report', '2017-12-26 01:24:34.183'),
(3203, '2018 FTR RE Budget Acceptance Report', '2017-12-19 13:47:48.580'),
(3156, '2018 FTR RE Budget Acceptance Report', '2017-12-13 16:54:01.317'),
(3147, '2018 FTR RE Budget Acceptance Report', '2017-12-13 13:35:02.627'),
(3141, '2018 FTR RE Budget Acceptance Report', '2017-12-04 13:57:41.427'),
(3248, 'Audit Income Statement', '2017-12-26 22:53:50.067'),
(3246, 'Audit Income Statement', '2017-12-26 17:42:39.227'),
(3244, 'Audit Income Statement', '2017-12-26 17:25:18.477'),
(3099, 'Audit Income Statement', '2017-11-24 15:33:10.333'),
(3091, 'Audit Income Statement', '2017-11-24 14:59:16.283'),
(3252, 'FTR ND Budget Acceptance Report', '2017-12-28 22:33:28.260'),
(3240, 'FTR ND Budget Acceptance Report', '2017-12-26 01:24:33.837'),
(3200, 'FTR ND Budget Acceptance Report', '2017-12-19 13:47:48.267'),
(3153, 'FTR ND Budget Acceptance Report', '2017-12-13 16:54:01.067');

谢谢大家!

这将保留最后3个版本(更正为保留最后3个版本)

示例

;with cte as (
    Select *,RN=Row_Number() over (Partition By Name ORder by CreateDate desc ) from #Reports
)
Delete from cte 
 Where RN>3

Select * from #Reports
ReportID    Name                                    CreateDate
3255        2018 FTR RE Budget Acceptance Report    2017-12-28 22:33:28.587
3243        2018 FTR RE Budget Acceptance Report    2017-12-26 01:24:34.183
3203        2018 FTR RE Budget Acceptance Report    2017-12-19 13:47:48.580
3248        Audit Income Statement                  2017-12-26 22:53:50.067
3246        Audit Income Statement                  2017-12-26 17:42:39.227
3244        Audit Income Statement                  2017-12-26 17:25:18.477
3252        FTR ND Budget Acceptance Report         2017-12-28 22:33:28.260
3240        FTR ND Budget Acceptance Report         2017-12-26 01:24:33.837
3200        FTR ND Budget Acceptance Report         2017-12-19 13:47:48.267
更新的表格

;with cte as (
    Select *,RN=Row_Number() over (Partition By Name ORder by CreateDate desc ) from #Reports
)
Delete from cte 
 Where RN>3

Select * from #Reports
ReportID    Name                                    CreateDate
3255        2018 FTR RE Budget Acceptance Report    2017-12-28 22:33:28.587
3243        2018 FTR RE Budget Acceptance Report    2017-12-26 01:24:34.183
3203        2018 FTR RE Budget Acceptance Report    2017-12-19 13:47:48.580
3248        Audit Income Statement                  2017-12-26 22:53:50.067
3246        Audit Income Statement                  2017-12-26 17:42:39.227
3244        Audit Income Statement                  2017-12-26 17:25:18.477
3252        FTR ND Budget Acceptance Report         2017-12-28 22:33:28.260
3240        FTR ND Budget Acceptance Report         2017-12-26 01:24:33.837
3200        FTR ND Budget Acceptance Report         2017-12-19 13:47:48.267

这是一个很好的答案!我非常感激。我以前使用过CTEs几次,但从未使用过OVER子句。那太圆滑了。谢谢你,我很高兴能帮上忙