2017-10-20 18 views
0

特定のジョブに関する情報を取得するクエリがあります。トップ1を最大列で表示

しかし、私は(最新の 'LastRun'フィールドに基づいて)各ジョブのトップレコードを取得するのに苦労しています。

どのように私はこれを達成することができますか?

私のクエリは次のとおりです。

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 

私は現在の結果を得る:

[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 

あなたは、ジョブごとに重複フィールドがある見ることができるように。私はちょうど各ジョブのトップレコードが欲しいので、最新のLastRunの日時の合計は4つだけにする必要があります

+0

重複したジョブがどこにあるのかわかりません –

+0

グループの中からhist.run_timeを削除して、selectのmax(またはmin?)(hist.run_time)に変更してください。それはうまくいく? –

+0

@RyanGadsdon結果の最初のレコードと最後のレコードが表示されます。彼らは同じ仕事です – Bodz

答えて

0

George Menoutisのおかげで、この回答は実行日とステータスフィールド:

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 

結果:

[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

使用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) 
CROSSが適用
0

「行ごと(n)の頂部」に有用である要件

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 
; 

種類の別々の列を追加、編集

一緒&時間、日付、簡単/迅速な方法は計算することですゼロ日からの日数を計算し、時間値をdatetimeにキャストした後、その時刻に追加します。

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

使用数ベースの日付関数を使用すると、日付に文字列を解釈するサーバーの設定に依存しない、と彼らは文字列への/からの変換よりも高速であることを意味します。

関連する問題