我的数据有点像上图。
我想根据每组 job_id、run_id、start_hour、end_hour 来注意具有最大 log_id 的最新条目。
我正在尝试使用下面的查询,但不幸的是它从组中返回最小的 log_id 记录而不是最大值。
请帮忙
select * from
(select * from job_monitor_log order by job_id,log_id)t1
group by job_id,run_id,start_hour,end_hour having max(log_id);
注意 - 查询应该按照 MYSQL
预期输出如下-
执行此操作的一种规范方法是加入一个子查询,该查询为您定义的每个组查找最新的 log_id
值:
SELECT j1.*
FROM job_monitor_log j1
INNER JOIN
(
SELECT job_id, run_id, start_hour, end_hour, MAX(log_id) AS max_log_id
FROM job_monitor_log
GROUP BY job_id, run_id, start_hour, end_hour
) j2
ON j1.job_id = j2.job_id AND
j1.run_id = j2.run_id AND
j1.start_hour = j2.start_hour AND
j1.end_hour = j2.end_hour AND
j1.log_id = j2.max_log_id;
如果你可以使用 MySQL 8+ 或更高版本,那么你可以在这里使用解析函数:
SELECT log_id, job_id, run_id, run_Date, start_hour, end_hour, job_status
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY job_id, run_id, start_hour, end_hour
ORDER BY log_id DESC) rn
FROM job_monitor_log
) t
WHERE rn = 1;
如果每组可能有两条或更多条记录关于具有最大 log_id
值,那么您可以将 ROW_NUMBER
替换为 RANK
或 DENSE_RANK
以包含所有此类关系。
为了涵盖所有基础,我们还可以使用相关子查询方法,这与您最初尝试做的事情一致:
SELECT log_id, job_id, run_id, run_Date, start_hour, end_hour, job_status
FROM job_monitor_log j1
WHERE log_id = (SELECT MAX(t2.log_id)
FROM job_monitor_log j2
WHERE j1.job_id = j2.job_id AND
j1.run_id = j2.run_id AND
j1.start_hour = j2.start_hour AND
j1.end_hour = j2.end_hour);
这将包括每组最大 log_id
值的所有关系。但是,这可能是给出的三个查询中性能最低的方法。但有时,在使用 ORM 框架之类的东西时,我们可能需要如上所示表达查询。