2015-04-02 3 views
1

Я пытаюсь создать запрос, который приведет к последнему СОСТОЯНИЮ JOB_ID, это было бы просто в SQL Server 2008 с использованием функции rank over partition, но на 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 

DESIRED ВЫВОД:

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

Вы можете сделать это с автообъединением, но это действительно некрасиво и крайне неэффективно (стоимость/срок идет вверх по экспоненте в виде таблицы становится больше). Как долго вы будете работать с искаженной, неподдерживаемой версией, например, 2000? –

+0

У нас нет бюджета для обновления. Передняя программа, использующая SQL Server, не поддерживает более новую технологию SQL Server. :) Я попробовал этот запрос, но он работает доцент, как бы вы это сделали? 'ВЫБРАТЬ h1.pk_ID, h1.Job_ID, h1.STATUS, h1.DATETIME \t ИЗ #job_hyst h1, h2 # job_hyst где h2.DATETIME

ответ

0

SQL Server имеет свободу для вставки записей в любом порядке, он хочет, так что я бы не стал Доверие IDENTITY(int, 1,1) до всегда gi у вас правильная последовательность. Однако он может работать в некоторых версиях.

Вы можете подключиться к второму запросу, где вы получите максимальное время datetime (или min 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

Смежные вопросы