mysql通過(guò)group?by分組取最大時(shí)間對(duì)應(yīng)數(shù)據(jù)的兩種有效方法
1、項(xiàng)目記錄表project_record的結(jié)構(gòu)和數(shù)據(jù)如下:
以下為項(xiàng)目記錄表project_record的所有數(shù)據(jù)。project_id為項(xiàng)目Id,on_project_time為上項(xiàng)目時(shí)間。(每一條數(shù)據(jù)代表著上某個(gè)項(xiàng)目(project_id)的時(shí)間(on_project_time)記錄)
2、我們的需求是:取出每個(gè)項(xiàng)目中最大上項(xiàng)目時(shí)間對(duì)應(yīng)的那條數(shù)據(jù)。(即根據(jù)project_id分組,取出每組中最大的on_project_time對(duì)應(yīng)的數(shù)據(jù)。)上方紅框是我們要查出的數(shù)據(jù)。
3、錯(cuò)誤代碼:
SELECT * FROM (SELECT * FROM project_record order by on_project_time desc) t GROUP BY project_id;
查詢結(jié)果錯(cuò)誤:
結(jié)果看似正確的,實(shí)則是錯(cuò)誤的。每個(gè)項(xiàng)目最大的上項(xiàng)目時(shí)間能正確查出,但是數(shù)據(jù)對(duì)應(yīng)的id不正確。
分析發(fā)現(xiàn),對(duì)于每一個(gè)分組,分組后的結(jié)果總是取組中主鍵(id)最小的數(shù)據(jù),即group by project_id 總會(huì)對(duì)project_id執(zhí)行排序(正序)
而不論臨時(shí)表(t)中是否已排序,都會(huì)取組中主鍵id最小的一行數(shù)據(jù)。換句話說(shuō) 臨時(shí)表t 內(nèi)的排序 無(wú)法影響外層的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)一張表,這個(gè)關(guān)聯(lián)表t2中的數(shù)據(jù)是對(duì)原表t1按照上項(xiàng)目時(shí)間倒敘排列,注意,此處必須使用distinct,此處distinct的作用可以理解為將t1表數(shù)據(jù)順序固定為t2表順序。
主表GROUP BY 后會(huì)取出按條件分組后的第一條數(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ù)。
本人習(xí)慣使用第一種方法。
總結(jié)
到此這篇關(guān)于mysql通過(guò)group by分組取最大時(shí)間對(duì)應(yīng)數(shù)據(jù)的兩種有效方法的文章就介紹到這了,更多相關(guān)mysql group by分組取對(duì)應(yīng)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)
- python?DataFrame數(shù)據(jù)分組統(tǒng)計(jì)groupby()函數(shù)的使用
- MySQL數(shù)據(jù)庫(kù)分組查詢group by語(yǔ)句詳解
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
- 基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù)
- 利用Pandas和Numpy按時(shí)間戳將數(shù)據(jù)以Groupby方式分組
- Sql group by 分組取時(shí)間最新的一條數(shù)據(jù)(示例代碼)
相關(guān)文章
CentOS6.5下RPM方式安裝mysql5.6.33的詳細(xì)教程
本文給大家詳細(xì)介紹CentOS6.5下RPM方式安裝mysql5.6.33的教程,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友一起看看吧2016-10-10mysql建庫(kù)時(shí)提示Specified key was too long max key length is 1000
本文將詳細(xì)提供mysql建庫(kù)時(shí)提示Specified key was too long max key length is 1000 bytes的問(wèn)題的解決方法,有需求的朋友可以參考2012-11-11解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_d
這篇文章主要介紹了解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_date'?column問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12MySQL基礎(chǔ)教程第一篇 mysql5.7.18安裝和連接教程
這篇文章主要為大家詳細(xì)介紹了MySQL基礎(chǔ)教程第一篇,mysql5.7.18安裝和連接教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Mysql在線回收undo表空間實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于Mysql在線回收undo表空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09MySQL 可擴(kuò)展設(shè)計(jì)的基本原則
可擴(kuò)展設(shè)計(jì)是一個(gè)非常復(fù)雜的系統(tǒng)工程,所涉及的各個(gè)方面非常的廣泛,技術(shù)也較為復(fù)雜,可能還會(huì)帶來(lái)很多其他方面的問(wèn)題。但不管我們?nèi)绾卧O(shè)計(jì),不管遇到哪些問(wèn)題,有些原則我們還是必須確保的。2021-05-05