mysql - 在 MYSQL 中查找组中的最新行

标签 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

最佳答案

执行此操作的一种规范方法是加入一个子查询,该查询为您定义的每个组查找最新的 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 框架之类的东西时,我们可能需要如上所示表达查询。

关于mysql - 在 MYSQL 中查找组中的最新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717445/

相关文章:

mysql - 对等值列的结果进行分组和限制

java - 无法通过java应用程序连接到数据库mysql

mysql - 无法通过 MySQL Workbench 连接到 Azure MySQL

mysql - 使用MYSQL数据库中的公共(public)字段分配表之间的关系

MySql 授予错误 : 'Select' is not valid at this position

MySQL Workbench 无法检索数据目录中的磁盘空间,服务器已停止

mysql - 我怎样才能做这个关系划分查询?

mysql - 使用 CONCAT 生成的字符串在存储过程中使用 CONCAT_WS() 将两列合并为一列

mysql - 使用条件按两列排序?

mysql - Mysql 工作台在应用时显示查询