1. 程式人生 > >在mysql中使用group by和order by取每個分組中日期最大一行資料

在mysql中使用group by和order by取每個分組中日期最大一行資料

轉載自:https://blog.csdn.net/shiyong1949/article/details/78482737

自己實際使用的時候group by 單列欄位 兩種方式獲取資料一致,博主情況未知,有待驗證多group by 

在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