Возврат уникальных результатов в объединенном выборе - PullRequest
3 голосов
/ 09 февраля 2011

Мне нужна помощь с запросом, который проверяет базу данных 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  

Пока все хорошо, но его запуск возвращает несколько результатов для одних и тех же заданий в зависимости от того, сколько раз они выполнялись до запроса. Это не хорошо. Мне нужен только один результат на работу и только последний.

Если я добавлю строку: ГДЕ b.session_id = (ВЫБЕРИТЕ МАКС (идентификатор_сессии) из msdb.dbo.sysjobactivity) Он работает лучше, но тогда он перечисляет только самые последние задания в зависимости от параметра session_id. Это исключит задания, которые некоторое время не выполнялись и тоже не годятся.

Может ли кто-нибудь помочь мне с этим? Я пробовал использовать DISTINCT и / или GROUP BY, но не могу заставить его работать.

1 Ответ

1 голос
/ 09 февраля 2011
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  
...