簡體   English   中英

SQL Server 2000中的排名查詢

[英]rank query in sql server 2000

我正在嘗試創建一個查詢,該查詢將帶來一個JOB_ID的最后狀態,這在SQL Server 2008中使用基於分區的排名功能很簡單,但是在SQL Server 2000上,此功能不可用。 我已經設法通過Job_ID升序和DATETIME降序將作業歷史記錄按順序放在臨時表中( # JOB_HISTORY-請注意pk_ID是使用以下臨時表生成的: IDENTITY(int, 1,1) ),但這是我卡住的部分,我不知道如何對這張表中的記錄進行排名。

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

SQL Server可以按任意順序自由插入記錄,因此我不相信IDENTITY(int, 1,1) 總是為您提供正確的順序。 它可能在某些版本中有效。

您可以在內部加入一個子查詢,在其中獲得最大日期時間(或最小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
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM