Sql server 删除除最近2个功能集(mastersp_id、exec_id)日志以外的执行日志

Sql server 删除除最近2个功能集(mastersp_id、exec_id)日志以外的执行日志,sql-server,tsql,Sql Server,Tsql,我必须创建一个存储过程来清除执行日志表中的数据(条件:应删除除最近2次以外的所有日志) 创建表并插入数据: create table tbltest12 (mastersp_id int, exec_id int, [procedure] varchar(50), [status] varchar(20), starttime DATETIME DEFAULT GETDATE(), endtime DATETIME DEFAULT GETDATE()) insert i

我必须创建一个存储过程来清除执行日志表中的数据(条件:应删除除最近2次以外的所有日志)

创建表并插入数据:

create table tbltest12 (mastersp_id int, exec_id int, [procedure] 
    varchar(50), [status] varchar(20), starttime DATETIME DEFAULT 
    GETDATE(), endtime DATETIME DEFAULT GETDATE())   
insert into tbltest12 values 
(1,1,'proc a', 'success', GETDATE(), GETDATE()),
(1,1,'proc b', 'success', GETDATE(), GETDATE()),
(1,1,'proc c', 'success', GETDATE(), GETDATE()),
(2,1,'proc y', 'success', GETDATE(), GETDATE()),
(2,1,'proc z', 'success', GETDATE(), GETDATE()),
(1,2,'proc a', 'success', GETDATE(), GETDATE()),
(1,2,'proc b', 'success', GETDATE(), GETDATE()),
(1,2,'proc c', 'success', GETDATE(), GETDATE()),
(2,2,'proc y', 'success', GETDATE(), GETDATE()),
(2,2,'proc z', 'success', GETDATE(), GETDATE()),
(2,3,'proc y', 'success', GETDATE(), GETDATE()),
(2,3,'proc z', 'success', GETDATE(), GETDATE()),
(1,3,'proc a', 'success', GETDATE(), GETDATE()),
(1,3,'proc b', 'success', GETDATE(), GETDATE()),
(1,3,'proc c', 'success', GETDATE(), GETDATE())
删除数据后,将保留以下数据集

    mastersp_id exec_id procedure   status  starttime           endtime
    1               2   proc a      success 02-09-2019 15:03    02-09-2019 15:03
    1               2   proc b      success 02-09-2019 15:03    02-09-2019 15:03
    1               2   proc c      success 02-09-2019 15:03    02-09-2019 15:03
    2               2   proc y      success 02-09-2019 15:03    02-09-2019 15:03
    2               2   proc z      success 02-09-2019 15:03    02-09-2019 15:03
    2               3   proc y      success 02-09-2019 15:03    02-09-2019 15:03
    2               3   proc z      success 02-09-2019 15:03    02-09-2019 15:03
    1               3   proc a      success 02-09-2019 15:03    02-09-2019 15:03
    1               3   proc b      success 02-09-2019 15:03    02-09-2019 15:03
    1               3   proc c      success 02-09-2019 15:03    02-09-2019 15:03

最简单的方法可能是使用一个公共表表达式,该表达式包含一个基于
densite\u rank
的列,并直接从cte中删除:

;WITH CTE AS 
(
    SELECT mastersp_id, exec_id, [procedure], [status], starttime, endtime,
           DENSE_RANK() OVER(PARTITION BY mastersp_id ORDER BY exec_id DESC) As Rn
    FROM tbltest12
)

DELETE 
FROM CTE
WHERE Rn > 2

您在发布示例数据和期望结果方面做了大量工作,但在展示自己的努力方面做得并不多。请回答您的问题,包括您当前的尝试以及出现的问题。@ZoharPeled:我已经努力了,但没有找到任何可行的解决方案:(那么您只想为每个过程保留两条记录,其中开始日期最高,对吗?@ZoharPeled:No。我想为两个存储过程(mastersp_id:1和2)保留两个最新的exec id的记录)这没有给出所需的输出。我已编辑了我的答案。使用
densite\u rank
而不是
row\u number
应该可以提供所需的结果。