如何查询Oracle中各调度作业的最后运行时间及状态
问题分析与修正方案
你的查询存在两个明显问题:
- 字段拼写错误:
staus应为status - 分组逻辑违规:按
job_name分组后,status既不在分组字段列表中,也未使用聚合函数,不符合SQL分组查询的语法规则,会直接报错。
正确查询写法
方法一:窗口函数(推荐)
利用ROW_NUMBER()按作业分组,再按运行时间倒序排序,取每个组的第一条记录,就是该作业最后一次运行的完整数据:
SELECT job_name, status, req_start_date FROM ( SELECT job_name, status, req_start_date, ROW_NUMBER() OVER (PARTITION BY job_name ORDER BY req_start_date DESC) AS rn FROM all_scheduler_job_run_details WHERE owner='ALI' ) t WHERE rn = 1;
方法二:关联子查询
先提取每个作业的最新运行时间,再关联原表匹配对应状态:
SELECT a.job_name, a.status, a.req_start_date FROM all_scheduler_job_run_details a JOIN ( SELECT job_name, MAX(req_start_date) AS max_start_date FROM all_scheduler_job_run_details WHERE owner='ALI' GROUP BY job_name ) b ON a.job_name = b.job_name AND a.req_start_date = b.max_start_date WHERE a.owner='ALI';
补充说明
- 窗口函数写法更简洁高效,大表场景下性能更优
- 若同一作业存在同一时间多次运行的情况,窗口函数会随机返回一条;如果需要保留所有同时间的记录,可将
ROW_NUMBER()替换为RANK()
内容的提问来源于stack exchange,提问作者Miralisher Mirxomidov
相关产品推荐
相关产品推荐

