在mysql中使用group by和order by取每一个分组中日期最大一行数据

转载自:https://blog.csdn.net/shiyong1949/article/details/78482737mysql

在mysql中使用group by进行分组后取某一列的最大值,咱们能够直接使用MAX()函数来实现,可是若是咱们要取最大值对应的ID,那么咱们须要取得整行的数据。最开始的实现方法以下sql

SELECT t.event_id,MAX(t.create_time) as create_time
from monitor_company_event t 
GROUP BY t.company_name,t.row_key,t.event_subType

执行以上SQL语句确实能够获得每一个分组中最大的create_time,可是经检查发现最大的create_time对应event_id不是同一行的数据,若是咱们要对event_id进行操做的话,结果确定是错误的。函数

最后在网上找到了一个变通的办法,以下spa

SELECT t.*
FROM (select * from `monitor_company_event` order by `create_time` desc limit 10000000000) t
GROUP BY t.company_name,t.row_key,t.event_subType

从以上SQL中能够看出,咱们先对全部的数据按create_time时间降序排列,而后再分组,那么每一个分组中排在最上面的记录就是时间最大的记录,对执行结果检查后,确实能够实现咱们的需求。.net

注意: 
limit 10000000000 是必需要加的,若是不加的话,数据不会先进行排序,经过 explain 查看执行计划,能够看到没有 limit 的时候,少了一个 DERIVED 操做。3d

explain 
SELECT t.*
FROM (select * from `monitor_company_event` order by `create_time` desc limit 10000000000) t
GROUP BY t.company_name,t.row_key,t.event_subType

 

explain 
SELECT t.*
FROM (select * from `monitor_company_event` order by `create_time` desc ) t
GROUP BY t.company_name,t.row_key,t.event_subType

相关文章
相关标签/搜索