在MySQL中从组中查找最新行

时间:2018-10-09 09:18:29

标签: mysql mysql-workbench

enter image description here

我的数据有点像上面。 我要介意的最新条目是每个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

预期输出如下-

enter image description here

1 个答案:

答案 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替换为RANKDENSE_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框架之类的东西时,我们可能需要如上所述表达查询。