group by獲取最大時間的一條記錄

1、項目記錄表project_record的結(jié)構(gòu)和數(shù)據(jù)如下:


以下為項目記錄表project_record的所有數(shù)據(jù)。project_id為項目Id,on_project_time為上項目時間。(每一條數(shù)據(jù)代表著上某個項目(project_id)的時間(on_project_time)記錄)


2、我們的需求是:取出每個項目中最大上項目時間對應(yīng)的那條數(shù)據(jù)。(即根據(jù)project_id分組,取出每組中最大的on_project_time對應(yīng)的數(shù)據(jù)。)上方紅框是我們要查出的數(shù)據(jù)。

3、錯誤代碼:

SELECT * 
FROM (SELECT * FROM project_record order by on_project_time desc) t 
GROUP BY project_id;

查詢結(jié)果錯誤:



結(jié)果看似正確的,實(shí)則是錯誤的。每個項目最大的上項目時間能正確查出,但是數(shù)據(jù)對應(yīng)的id不正確。

分析發(fā)現(xiàn),對于每一個分組,分組后的結(jié)果總是取組中主鍵(id)最小的數(shù)據(jù),即group by project_id 總會對project_id執(zhí)行排序(正序)

而不論臨時表(t)中是否已排序,都會取組中主鍵id最小的一行數(shù)據(jù)。換句話說 臨時表t 內(nèi)的排序 無法影響外層的group by 的操作。

4、 正確方法如下:

方法一:

SELECT t1.*
FROM project_record t1
INNER JOIN (
SELECT DISTINCT(id) id
FROM project_record 
ORDER BY on_project_time DESC) AS t2 ON t2.id = t1.id
GROUP BY t1.project_id;

查詢結(jié)果正確:

思路:需要關(guān)聯(lián)一張表,這個關(guān)聯(lián)表t2中的數(shù)據(jù)是對原表t1按照上項目時間倒敘排列,注意,此處必須使用distinct,此處distinct的作用可以理解為將t1表數(shù)據(jù)順序固定為t2表順序。
主表GROUP BY 后會取出按條件分組后的第一條數(shù)據(jù)。

方法二:

select t1.*
FROM project_record t1
INNER JOIN (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY on_project_time DESC),',',1) AS id
FROM project_record GROUP BY project_id) AS t2 ON t2.id = t1.id;

查詢結(jié)果正確:


SUBSTRING_INDEX 用法:取排序后的分組的第一條數(shù)據(jù)。
相比較而言 第一種更好些

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容