2015-04-02 75 views
1

我想創建一個查詢,它將帶來JOB_ID的最後一個狀態,這在SQL Server 2008中使用rank over分區函數很簡單,但在SQL Server 2000上,此功能不是可用。 我已經成功地通過Job_ID升序和DATETIME降序在臨時表(#JOB_HISTORY-注意pk_ID在臨時表中使用IDENTITY(int, 1,1)生成),但這裏是我得到的部分卡住了,我不知道如何排列這張表中的記錄。在SQL Server 2000中的等級查詢

SELECT 
    h1.pk_ID, 
    h1.Job_ID, 
    h1.Status, 
    h1.DATETIME 
FROM #JOB_HISTORY h1 
ORDER BY h1.pk_ID ASC; 

#JOB_HISTORY結果:

pk_ID, Job_ID, STATUS,   DATETIME 

1  1234 Succeded.  2015-03-30 12:10 
2  1234 Failed.   2015-03-30 01:00 
3  1234 Failed.   2015-03-28 01:00 
4  5678 Failed.   2015-04-02 04:00 
5  5678 Succeded.  2015-04-01 04:00 
6  5678 Succeded.  2015-03-31 04:00 

所需的輸出:

Job_ID STATUS  DATETIME 
1234  Succeded. 2015-03-30 12:10 
5678  Failed.  2015-04-02 04:00 
+0

爲此,您可以用自加入,但它實在是太醜了,非常低效的(成本/時間呈指數級上升爲表變得更大)。你要用一個像2000這樣的殘缺的,不受支持的版本運行多久? – 2015-04-02 15:35:56

+0

我們沒有升級預算。使用SQL Server的前臺程序不支持較新的SQL Server技術。 :)我試過這個查詢,但它的劑量工作,你會如何做這個選擇? '選擇h1.pk_ID,h1.Job_ID,h1.STATUS,h1.DATETIME \t FROM #job_hyst H1,#job_hyst H2 其中h2.DATETIME 2015-04-03 07:58:03

回答

0

SQL Server有自由插入記錄就是了任何順序,所以我不會信任IDENTITY(int, 1,1)總是 gi讓你有正確的順序。它可能在某些版本中工作。

你可以在內部加入一個子查詢,在那裏你得到最大日期時間(或最小pk_ID)來獲取第一行/最後一行。以下是獲取每個作業的最後結果在SQL Server 2000中的工作示例:

use msdb; 

select 
    sysjobhistory.job_id       as job_id 
    -- https://msdn.microsoft.com/en-us/library/ms174997.aspx 
, case sysjobhistory.run_status 
     when 0 then 'Failed' 
     when 1 then 'Succeeded' 
     when 2 then 'Retry' 
     when 3 then 'Canceled' 
     else    cast(sysjobhistory.run_status as varchar(10)) 
    end            as run_status 
, jobLastHistory.lastDateTime      as execution_time 
FROM dbo.sysjobhistory as sysjobhistory 
    inner join (
     --last datetime for each job_id 
     SELECT 
      history.job_id 
     , max(          --newest 
       CONVERT(DATETIME, STUFF(STUFF(STUFF( --yyyymmddhhmiss --> datetime 
        cast(history.run_date as varchar(8))--yyyymmdd 
        +right('000000'+cast(history.run_time as varchar(8)),6) --hhmiss 
       ,13,0,':'),11,0,':'),9,0,' ')) 
      )           AS lastDateTime 
     FROM dbo.sysjobhistory as history 
     where history.step_id = 0 --job outcome 
     group by 
      history.job_id 
    ) as jobLastHistory 
     on jobLastHistory.job_id 
      = sysjobhistory.job_id --same job 
     and convert(varchar(8),jobLastHistory.lastDateTime,112) 
      = sysjobhistory.run_date --latest date (yyyymmdd) 
     and replace(convert(varchar(8),jobLastHistory.lastDateTime,108),':','') 
      = sysjobhistory.run_time --latest time (hhmiss) 
where sysjobhistory.step_id = 0 --job outcome 
; 
+0

你沒有提到劑我猜想的工作。但你應該可以使用修改這個查詢來滿足你的需求。 – jumxozizi 2016-10-19 15:05:16