在mysql中从组中查找最新行

8qgya5xd  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(368)

这个问题在这里已经有答案了

sql仅选择列上具有最大值的行[重复](27个答案)
两年前关门了。

我的数据有点像上面。我想根据作业id、运行id、开始小时、结束小时的每组,记住具有最大日志id的最新条目。
我试图使用下面的查询,但不幸的是,它返回的是组中的最小日志id记录,而不是最大日志id记录。
请帮忙

  1. select * from
  2. (select * from job_monitor_log order by job_id,log_id)t1
  3. group by job_id,run_id,start_hour,end_hour having max(log_id);

注意-查询应该按照mysql
预期产量如下-

u5i3ibmn

u5i3ibmn1#

一种规范的方法是连接到一个子查询,该子查询查找最新的 log_id 定义的每个组的值:

  1. SELECT j1.*
  2. FROM job_monitor_log j1
  3. INNER JOIN
  4. (
  5. SELECT job_id, run_id, start_hour, end_hour, MAX(log_id) AS max_log_id
  6. FROM job_monitor_log
  7. GROUP BY job_id, run_id, start_hour, end_hour
  8. ) j2
  9. ON j1.job_id = j2.job_id AND
  10. j1.run_id = j2.run_id AND
  11. j1.start_hour = j2.start_hour AND
  12. j1.end_hour = j2.end_hour AND
  13. j1.log_id = j2.max_log_id;

如果您可以使用mysql 8+或更高版本,那么您可以在这里使用分析函数:

  1. SELECT log_id, job_id, run_id, run_Date, start_hour, end_hour, job_status
  2. FROM
  3. (
  4. SELECT *,
  5. ROW_NUMBER() OVER (PARTITION BY job_id, run_id, start_hour, end_hour
  6. ORDER BY log_id DESC) rn
  7. FROM job_monitor_log
  8. ) t
  9. WHERE rn = 1;

如果每组有两个或多个记录,关于最大 log_id 值,则可以替换 ROW_NUMBERRANK 或者 DENSE_RANK 包括所有这些关系。
为了涵盖所有的基础,我们还可以使用相关子查询方法,这与您最初尝试的方法相同:

  1. SELECT log_id, job_id, run_id, run_Date, start_hour, end_hour, job_status
  2. FROM job_monitor_log j1
  3. WHERE log_id = (SELECT MAX(t2.log_id)
  4. FROM job_monitor_log j2
  5. WHERE j1.job_id = j2.job_id AND
  6. j1.run_id = j2.run_id AND
  7. j1.start_hour = j2.start_hour AND
  8. j1.end_hour = j2.end_hour);

这将包括最大 log_id 每组的值。但是,这可能是给出的三个查询中性能最低的方法。但有时,在使用orm框架之类的东西时,我们可能需要像上面所示的那样表达查询。

展开查看全部

相关问题