在mysql中使用group by進行分組后取某一列的最大值,我們可以直接使用MAX()函數來實現,但是如果我們要取最大值對應的ID,那么我們需要取得整行的數據。最開始的實現方法如下
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進行操作的話,結果肯定是錯誤的。
最后在網上找到了一個變通的辦法,如下
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時間降序排列,然后再分組,那么每個分組中排在最上面的記錄就是時間最大的記錄,對執行結果檢查后,確實可以實現我們的需求。
注意:
limit 10000000000 是必須要加的,如果不加的話,數據不會先進行排序,通過 explain 查看執行計划,可以看到沒有 limit 的時候,少了一個 DERIVED 操作。
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
轉: https://blog.csdn.net/shiyong1949/article/details/78482737