Вы можете использовать оконную функцию 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'