2017-10-20 42 views
0

J'ai une requête qui obtient des informations sur des travaux spécifiques. Cependant, j'ai du mal à obtenir le meilleur résultat pour chaque travail (basé sur le dernier champ 'LastRun').Afficher le top 1 par colonne max

Toute aide sur comment je peux y parvenir?

Ma requête est:

SELECT 
job.Name, 
CAST(CAST(hist.run_date AS CHAR(8)) 
+ ' ' 
+ STUFF(
STUFF(RIGHT('000000' + CAST(hist.run_time AS VARCHAR(6)), 6) 
, 3, 0, ':') 
, 6, 0, ':') 
AS DATETIME) AS LastRun, 
CASE hist.run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Success' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Canceled' 
    WHEN 4 THEN 'In progress' 
END AS Status, 
CASE job.enabled 
WHEN 0 THEN 'False' 
    WHEN 1 THEN 'True' 
END AS Enabled 
FROM dbo.sysjobhistory hist 
JOIN dbo.sysjobs_view job ON job.job_id=hist.job_id      
WHERE job.[name] = '[Parallel] Copy DBOutboxMaster' 
OR job.[name] = '[Parallel] Copy filestore to PPE' 
OR job.[name] = '[Parallel] copyLogShippingForECW' 
OR job.[name] = '[Parallel] copyLogShippingForNLASQL' 
GROUP BY job.name,hist.run_date,hist.run_time,hist.run_status,job.enabled 
ORDER BY lastrun DESC 

Je reçois actuellement les résultats:

[Parallel] Copy DBOutboxMaster 2017-10-20 09:32:00.000 Success True 
[Parallel] Copy filestore to PPE 2017-10-20 09:32:00.000 Success True 
[Parallel] copyLogShippingForECW 2017-10-20 09:32:00.000 Success True 
[Parallel] copyLogShippingForNLASQL 2017-10-20 09:31:11.000 Success True 
[Parallel] Copy DBOutboxMaster 2017-10-20 09:31:00.000 Success True 

Comme vous pouvez le voir, il y a des champs en double pour chaque tâche. Je veux juste le record pour chaque travail, donc au total il ne devrait y avoir que 4 résultats de la dernière date de LastRun

+0

Je ne comprends pas où vos travaux en double sont –

+0

Supprimer hist.run_time de groupe par, changer à max (ou min?) (Hist.run_time) dans le select. WOuld ça marche? –

+0

@RyanGadsdon voir le premier enregistrement et le dernier enregistrement du résultat. Ils sont le même travail – Bodz

Répondre

0

Grâce à George Menoutis, la réponse à ceci est dans la requête suivante, en regroupant la date d'exécution et la champs d'état:

SELECT 
job.Name, 
MAX(CAST(CAST(hist.run_date AS CHAR(8)) 
+ ' ' 
+ STUFF(
STUFF(RIGHT('000000' + CAST(hist.run_time AS VARCHAR(6)), 6) 
, 3, 0, ':') 
, 6, 0, ':') 
AS DATETIME)) AS LastRun, 
MAX(CASE hist.run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Success' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Canceled' 
    WHEN 4 THEN 'In progress' 
END) AS STATUS, 
CASE job.enabled 
WHEN 0 THEN 'False' 
    WHEN 1 THEN 'True' 
END AS Enabled 
FROM dbo.sysjobhistory hist 
JOIN dbo.sysjobs_view job ON job.job_id=hist.job_id      
WHERE job.[name] = '[Parallel] Copy DBOutboxMaster' 
OR job.[name] = '[Parallel] Copy filestore to PPE' 
OR job.[name] = '[Parallel] copyLogShippingForECW' 
OR job.[name] = '[Parallel] copyLogShippingForNLASQL' 
GROUP BY job.name,job.enabled 
ORDER BY lastrun DESC 

Résultat:

[Parallel] Copy DBOutboxMaster 2017-10-20 09:43:00.000 Success True 
[Parallel] Copy filestore to PPE 2017-10-20 09:43:00.000 Success True 
[Parallel] copyLogShippingForECW 2017-10-20 09:32:00.000 Success True 
[Parallel] copyLogShippingForNLASQL 2017-10-20 09:31:11.000 Success True 
0

utilisation TOP 1 WITH TIES + ROW_NUMBER:

SELECT TOP 1 WITH TIES * 
FROM (
    SELECT job.[Name], 
      CAST(CAST(hist.run_date AS CHAR(8)) 
      + ' ' 
      + STUFF(
      STUFF(RIGHT('000000' + CAST(hist.run_time AS VARCHAR(6)), 6) 
      , 3, 0, ':') 
      , 6, 0, ':') 
      AS DATETIME) AS LastRun, 
      CASE hist.run_status 
       WHEN 0 THEN 'Failed' 
       WHEN 1 THEN 'Success' 
       WHEN 2 THEN 'Retry' 
       WHEN 3 THEN 'Canceled' 
       WHEN 4 THEN 'In progress' 
      END AS Status, 
      CASE job.enabled 
      WHEN 0 THEN 'False' 
       WHEN 1 THEN 'True' 
      END AS Enabled 
    FROM dbo.sysjobhistory hist 
    JOIN dbo.sysjobs_view job ON job.job_id=hist.job_id      
    WHERE job.[name] = '[Parallel] Copy DBOutboxMaster' 
     OR job.[name] = '[Parallel] Copy filestore to PPE' 
     OR job.[name] = '[Parallel] copyLogShippingForECW' 
     OR job.[name] = '[Parallel] copyLogShippingForNLASQL' 
    GROUP BY job.name,hist.run_date,hist.run_time,hist.run_status,job.enabled 
) as t 
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY lastrun DESC) 
0

CROSS APPLY est utile "top (n) par ligne" exigences

SELECT 
     job.Name 
     , ca.LastRun 
     , ca.Status 
     , CASE job.enabled 
       WHEN 0 THEN 'False' 
       WHEN 1 THEN 'True' 
     END AS Enabled 
FROM dbo.sysjobs_view job 
CROSS APPLY (
     SELECT TOP(1) 
       dateadd(day,datediff(day,0,run_date),cast(run_time as datetime)) AS LastRun 
       , CASE hist.run_status 
         WHEN 0 THEN 'Failed' 
         WHEN 1 THEN 'Success' 
         WHEN 2 THEN 'Retry' 
         WHEN 3 THEN 'Canceled' 
         WHEN 4 THEN 'In progress' 
       END AS Status 
     FROM dbo.sysjobhistory hist 
     ORDER BY dateadd(day,datediff(day,0,run_date),cast(run_time as datetime)) DESC 
     WHERE hist.job_id = job.job_id 
     ) AS ca 
WHERE job.[name] = '[Parallel] Copy DBOutboxMaster' 
OR job.[name] = '[Parallel] Copy filestore to PPE' 
OR job.[name] = '[Parallel] copyLogShippingForECW' 
OR job.[name] = '[Parallel] copyLogShippingForNLASQL' 
ORDER BY ca.LastRun DESC 
; 

EDIT

Pour ajouter des colonnes séparées de types datent & temps ensemble, une méthode simple/rapide consiste à calculer le nombre de jours à partir de la date zéro, puis ajoutez-le à l'heure, après avoir converti la valeur de l'heure en date/heure.

dateadd(day, datediff(day,0,run_date) ,cast(run_time as datetime)) 

utilisant le numéro de fonctions de date en fonction signifie que vous n'êtes pas dépendant de paramètres du serveur pour interpréter les chaînes en dates, et ils sont plus rapides que la conversion en/à partir de chaînes.