我的数据有点像上面。 我要介意的最新条目是每个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
预期输出如下-
答案 0 :(得分:1)
一种典型的实现方法是加入一个子查询,该子查询为您定义的每个组找到最新的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框架之类的东西时,我们可能需要如上所述表达查询。