2016-04-21 5 views
0

wählt Durchschnitt der Top-3 für jeden spezifischen SQL-Auftrag

SELECT jobs.Job_ID AS JobID , 
 
        jobs.NAME AS JobName , 
 
        act.start_execution_date AS StartExecutionDate , 
 
        AVG(FLOOR(run_duration/100)) AS AvgDurationMin , 
 
        CASE 
 
\t \t --If job average less than 5 minutes then limit is avg+10 minutes 
 
         WHEN AVG(FLOOR(run_duration/100)) <= 5 
 
         THEN (AVG(FLOOR(run_duration/100))) + 2 
 
\t \t --If job average greater than 5 minutes then limit is avg*limit percentage 
 
         ELSE (AVG(FLOOR(run_duration/100)) 
 
           ) 
 
        END AS DurationLimit , 
 
        DATEDIFF(MI, act.start_execution_date, GETDATE()) AS [CurrentDuration] 
 
      FROM @currently_running_jobs crj 
 
        INNER JOIN msdb..sysjobs AS jobs ON crj.job_id = jobs.job_id 
 
        INNER JOIN msdb..sysjobactivity AS act ON act.job_id = crj.job_id 
 
                   AND act.stop_execution_date IS NULL 
 
                   AND act.start_execution_date IS NOT NULL 
 
        INNER JOIN msdb..sysjobhistory AS hist ON hist.job_id = crj.job_id 
 
                   AND hist.step_id = 0 
 
      WHERE crj.job_state = 1 --and jobs.NAME = 'long_running_testing' 
 
      GROUP BY jobs.job_ID , 
 
        jobs.NAME , 
 
        act.start_execution_date , 
 
        DATEDIFF(MI, act.start_execution_date, GETDATE()) 
 
\t \t \t \t \t HAVING CASE WHEN AVG(FLOOR(run_duration/100)) <= 5 
 
\t \t \t \t \t \t \t THEN (AVG(FLOOR(run_duration/100))) + 2 
 
          --THEN (AVG(FLOOR(run_duration/100))) + 1 
 
         ELSE (AVG(FLOOR(run_duration/100)) 
 
           ) 
 
        END < DATEDIFF(MI, act.start_execution_date, GETDATE())

Kann jemand bitte helfen Sie mir die durchschnittliche run_duration der letzten drei Einträge der Aufgabe, durch job_name partitioniert zu extrahieren?

Das folgende Skript, das ich verwendet habe, um Informationen der letzten drei run_duration partitioniert von job_name, aber es berechnet den Durchschnitt aller run_duration.

Hier brauche ich nur die letzten drei Run_Duration Durchschnittszahl.

a boring table with guids and datetimes and sooper seecrit JobNames, carefully redacted

SELECT top 1 with ties jobs.Job_ID AS JobID , AVG(FLOOR(run_duration/100%100)), 
        jobs.NAME AS JobName , 
        act.start_execution_date AS StartExecutionDate 
from msdb..sysjobs AS jobs 
inner join msdb..sysjobactivity AS act ON act.job_id = jobs.job_id 
INNER JOIN msdb..sysjobhistory AS hist ON hist.job_id = jobs.job_id AND hist.step_id = 0 

GROUP BY jobs.job_ID , 
        jobs.NAME 
      ,  act.start_execution_date ,hist.run_duration, 
        DATEDIFF(MI, act.start_execution_date, GETDATE()) 
order by case when row_number() over (partition by jobs.NAME order by hist.run_duration desc) <= 3 then 0 else 1 end; 

Antwort

1

Vielleicht ein CTE würde es vereinfachen.

with SeqByJob_cte as ( SELECT jobs.NAME AS JobName 
          ,hist.run_duration 
          ,row_number() over(partition by jobs.NAME order by act.start_execution_date desc) as seq 
        from msdb..sysjobs AS jobs 
          inner join msdb..sysjobactivity AS act ON act.job_id = jobs.job_id 
          INNER JOIN msdb..sysjobhistory AS hist ON hist.job_id = jobs.job_id AND hist.step_id = 0) 
select avg(run_duration) as AvgOf3MostRecentRuns 
     ,CASE 
    --If job average less than 5 minutes then limit is avg+10 minutes 
        WHEN AVG(FLOOR(run_duration/100)) <= 5 
        THEN (AVG(FLOOR(run_duration/100))) + 2 
    --If job average greater than 5 minutes then limit is avg*limit percentage 
        ELSE (AVG(FLOOR(run_duration/100)) 
          ) 
       END AS DurationLimit 
     ,JobName 
from SeqByJob_cte 
where seq <= 3 
group by JobName 
+0

Vielen Dank cyndi..and können Sie mir bitte führen, wo i case-Anweisung here..The scenorio i Fall verwenden möchten, wie Fall verwenden können (1) --Wenn Durchschnitt Job weniger als 5 Minuten, dann Limit ist Durchschnitt + 10 Minuten Fall (2) - Wenn Job durchschnittlich größer als 5 Minuten ist dann Limit ist AVG * Limit Prozentsatz. Und bitte finden Sie die T-SQL im Kommentar, die erstellt haben, um Avgerage, duration_limit und current_run_time zu berechnen. Können Sie mir bitte dabei helfen .. – Nathan

+0

Ich habe das Skript oben im Schnipsel (neu) hinzugefügt .. können Sie bitte einen Blick darauf .. es ist wie unten, veröffentlichte vollständige Abfrage in den oben genannten Schnipsel .. CASE \t \t --Wenn Job Durchschnitt weniger als 5 Minuten, dann ist Grenze avg + 10 Minuten WENN AVG (FLOOR (run_duration/100)) <= 5 dANN (AVG (FLOOR (run_duration/100))) + 2 \t \t --Wenn Job durchschnittlich mehr als 5 Minuten, dann ELSE avg * Limit Prozentgrenze (AVG (FLOOR (run_duration/100)) ) END AS DurationLimit, – Nathan

+0

ich hinzugefügt, um die Dauer Begrenzung für die endgültige select-Anweisung in der Antwort . Hilft das? –

Verwandte Themen