如何获取每个sql作业的前5个历史记录行?

如何获取每个sql作业的前5个历史记录行?,sql,sql-server,Sql,Sql Server,我正在尝试获取每个sql作业的前5个最新版本。 我试着这样质疑它 SELECT Pr1.job_ID,MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time) LastRun, COUNT(*) num FROM MSDB.dbo.sysjobhistory Pr1 JOIN MSDB.dbo.sysjobhistory Pr2 ON MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time) =

我正在尝试获取每个sql作业的前5个最新版本。 我试着这样质疑它

SELECT Pr1.job_ID,MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time) LastRun, COUNT(*) num
FROM MSDB.dbo.sysjobhistory Pr1 
JOIN MSDB.dbo.sysjobhistory Pr2
    ON MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time) = MSDB.dbo.Agent_datetime(Pr2.run_date, Pr2.run_time)
     AND Pr1.job_ID = Pr2.job_ID
GROUP BY Pr1.job_ID, MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time)
HAVING COUNT (*) <= 5
ORDER BY job_ID, MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time)
但是这个查询永远运行。我正在使用sql server

我还尝试了下面的推荐

WITH CTE AS
(
   SELECT jo.name,Pr1.job_ID, Pr1.run_date, Pr1.run_time,pr1.run_status,
          Count(*) Over (Partition By Pr1.job_ID,Pr1.run_date,Pr1.run_time) As num,
          Row_Number() Over (Partition By Pr1.job_ID,Pr1.run_date,Pr1.run_time
                             Order By  pr1.run_date desc--, pr1.run_time desc
                             ) As Rn
   FROM   MSDB.dbo.sysjobhistory Pr1 
   join MSDB.dbo.sysjobs jo on jo.job_id=pr1.job_id
   JOIN MSDB.dbo.sysjobhistory Pr2 
         ON Pr1.job_ID = Pr2.job_ID --and pr1.run_status=pr2.run_status
         and pr1.run_date >=pr2.run_date and pr1.run_time >=pr2.run_time 
)
SELECT name,job_ID, run_date, run_time,run_status
FROM CTE
WHERE num <= 3 AND Rn = 1 
使用行号:


它将永远运行,因为您使用标量值函数Agent\u datetime。如果您使用的查询不需要这些函数,那么查询优化器可以完成它的工作并使用索引

您可以使用窗口函数和通用表表达式简化任务。以下组按列job_ID排序,并根据运行日期和运行时间列返回每个组的最新记录:


您使用的rdbms是什么,前5名表示您使用sql server?它将永远运行,因为您使用的是sclar值函数Agent_datetime。好的,我如何修复pls?是的,我在sql Server上,您可以通过不使用该函数来修复它。是否有任何方法可以让作业的时间和日期运行?请尝试使用MeaningfulDateTimeColumn=>Order by pr1.run\u date desc,pr1.run\u time desc。它仍然运行forever@aye26:您是否仍在使用Agent_datetime函数?@aye26:为什么需要自加入表?我已经编辑了我的answer@aye26:如果将索引放在作业id上,将复合索引放在列run_date DESC+run_time DESC上,则会有所帮助。如果尚未存在,则假定作业id已是外键。
select pr.*
from (select pr.*,
             row_number() over (partition by pr.job_id
                                order by pr.run_date desc, pr.run_time desc
                               ) as seqnum
      from MSDB.dbo.sysjobhistory pr
     ) pr
where seqnum <= 5;
WITH CTE AS
(
   SELECT Pr1.job_ID, Pr1.run_date, Pr1.run_time,
          Count(*) Over (Partition By Pr1.job_ID) As num,
          Row_Number() Over (Partition By Pr1.job_ID 
                             Order By Pr1.run_date DESC, Pr1.run_time DESC) As Rn
   FROM   MSDB.dbo.sysjobhistory
)
SELECT job_ID, run_date, run_time
FROM CTE
WHERE num <= 3 AND Rn = 1  
ON MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time) 
 = MSDB.dbo.Agent_datetime(Pr1.run_date, Pr1.run_time)