在连接的选择中返回唯一结果

时间:2011-02-09 10:32:16

标签: sql tsql unique distinct

我需要帮助查询MSDB数据库以查找SQL Server代理作业结果。我的查询如下:


SELECT CONVERT(VARCHAR(30), Serverproperty('ServerName')),
       a.run_status,
       b.run_requested_date,
       c.name,
       CASE c.enabled
         WHEN 1 THEN 'Enabled'
         ELSE 'Disabled'
       END,
       CONVERT(VARCHAR(10), CONVERT(DATETIME, Rtrim(19000101))+(a.run_duration *
       9 +
       a.run_duration % 10000 * 6 + a.run_duration % 100 * 10) / 216e4, 108),
       b.next_scheduled_run_date
FROM   (msdb.dbo.sysjobhistory a
        LEFT JOIN msdb.dbo.sysjobactivity b
          ON b.job_history_id = a.instance_id)
       JOIN msdb.dbo.sysjobs c
         ON b.job_id = c.job_id
ORDER  BY c.name  

到目前为止一切顺利,但运行它会返回相同作业的多个结果,具体取决于它们在查询之前运行了多少次。这不好。我希望每份工作只有一个结果,而且只需要最新的结果。

如果我添加字符串: WHERE b.session_id =(来自msdb.dbo.sysjobactivity的SELECT MAX(session_id)) 它工作得更好,但它只根据session_id参数列出最新的作业。这将排除那些没有运行一段时间但也不好的工作。

有人可以帮我吗? 我尝试过使用DISTINCT和/或GROUP BY但无法使其正常工作。

1 个答案:

答案 0 :(得分:1)

with cte
     AS (SELECT
     Convert(varchar(30), SERVERPROPERTY('ServerName')) AS ServerName,
     a.run_status,
     b.run_requested_date,
     c.name,
     CASE c.enabled
       WHEN 1 THEN 'Enabled'
       Else 'Disabled'
     END
        AS Enabled,
     CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101))+(a.run_duration
        * 9 +
     a.run_duration % 10000 * 6 + a.run_duration % 100 * 10) / 216e4, 108)
        AS run_duration,
     b.next_scheduled_run_date,
     ROW_NUMBER() over (partition by b.job_id ORDER BY b.run_requested_date
        DESC) AS RN
         FROM   (msdb.dbo.sysjobhistory a
                 LEFT JOIN msdb.dbo.sysjobactivity b
                   ON b.job_history_id = a.instance_id)
                join msdb.dbo.sysjobs c
                  on b.job_id = c.job_id)
SELECT *
FROM   cte
WHERE  RN = 1
ORDER  BY name