Получить список заданий с 3 последовательными сбоями - PullRequest
2 голосов
/ 29 марта 2019

Значение fail_count не является надежным в Oracle, поэтому я ищу SQL для запроса SYS.ALL_SCHEDULER_JOB_RUN_DETAILS.

Для начала, вот таблица, которая содержит подробности выполнения, в этом запросе я добавил жестко запрограммированное имя задания и просто получил последние 3 запуска.

SELECT * 
FROM SYS.ALL_SCHEDULER_JOB_RUN_DETAILS 
WHERE JOB_NAME = 'MY JOB' 
ORDER BY LOG_ID 
FETCH FIRST 3 ROWS ONLY

То, что я хочу сделать, это объединить это с запросом к ALL_SCHEDULER_JOBS, который может для каждого задания, проверить последние 3 запуска и, если STATUS для всех 3 равно 'FAILED', вернуть что-то.

Я просто не уверен, как это сделать.

1 Ответ

0 голосов
/ 30 марта 2019

Вы можете использовать оконную функцию ROW_NUMBER() в подзапросе, чтобы присвоить ранг каждой записи журнала в группах записей, имеющих одинаковый job_name.

Если вы просто хотите, чтобы имена заданий, последние три запуска которых были неудачными, можно использовать агрегирование во внешнем запросе. Предложение HAVING фильтрует соответствующие записи.

SELECT job_name
FROM (
    SELECT 
        job_name, 
        status,
        ROW_NUMBER() OVER(PARTITION BY job_name ORDER BY log_date DESC) rn 
    FROM sys.all_scheduler_job_run_details
) x
WHERE rn <= 3
GROUP BY job_name
HAVING
    MIN(status) = 'FAILED'
    AND MAX(status) = 'FAILED'

Примечание:

  • Я думаю, что вам не нужно вводить системное представление ALL_SCHEDULER_JOBS, чтобы получить ожидаемый результат (ALL_SCHEDULER_JOB_RUN_DETAILS имеет всю необходимую нам информацию)
  • Я подозреваю, что вы хотите отсортировать записи, используя log_date вместо log_id

С другой стороны, если вам нужно заполнить записи журнала для заданий, которые соответствуют критериям, вам потребуется дополнительный уровень подзапроса, например:

SELECT * FROM (
    SELECT 
        x.*, 
        MAX(status) OVER(PARTITION BY job_name) max_status,
        MIN(status) OVER(PARTITION BY job_name) min_status
    FROM (
        SELECT 
            j.*, 
            ROW_NUMBER() OVER(PARTITION BY job_name ORDER BY log_date DESC) rn 
        FROM sys.all_scheduler_job_run_details j
    ) x
    WHERE rn <= 3
) y 
WHERE 
    max_status = 'FAILED'
    AND min_status = 'FAILED'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...