方法一、將時間進(jìn)行排序后再分組
該表表名為customer,? park_id表示園區(qū)id,joined_at表示用戶的加入時間,created_at表示用戶的創(chuàng)建時間。
需求:查出每個園區(qū)中,最早加入園區(qū)的第一位用戶
select * from (select * from customer order by joined_at,created_at asc limit 1000) as tem group by park_id;
查出id為 1和9的兩條數(shù)據(jù)
解題思路:
? ? ? 【提示】? 此處使用 limit 是為了確保,group by分組的時候會按照子查詢中輸出的排列順序進(jìn)行分組。?
? ? ? ? group by 之后拿取的數(shù)據(jù),是每個分組中的第一條數(shù)據(jù)。
? ? ? ? 所以我們只需要保證將joined_at時間最早的數(shù)據(jù)排在最前面,當(dāng)以park_id進(jìn)行分組操作時,拿到的第一條數(shù)據(jù)必然是joined_at時間最早的一條。
? ? ? ? (數(shù)據(jù)重復(fù)時的處理)觀察表我們可以看到id為1和12的數(shù)據(jù)都是2020-04-17加入的,但是兩者之間他們的創(chuàng)建時間又有先后順序的區(qū)分,id為12的要早一天,所以我們需要的是id為12的。 此刻我們就在排序的時候?qū)reated_at的排序加在joined_at后面。
這樣就實現(xiàn)了在主要字段joined_at有重復(fù)數(shù)據(jù)的時候,我們按照第二個排序規(guī)則created_at字段進(jìn)行追加排序,并拿取joined_at和created_at時間為最新的
? ? ? ? ? ? ? ??
方法二、拿取到每組最小時間并進(jìn)行關(guān)聯(lián)查詢
需求:查詢出每個園區(qū)最早加入的客戶信息
select * from customer as c right join (select park_id,min(joined_at) as min_joined_at from customer group by park_id) as tem
on c.park_id=tem.park_id and c.joined_at=tem.min_joined_at;
查詢結(jié)果:
根據(jù)查詢可以看出,314園區(qū)的兩條加入時間最早的數(shù)據(jù)都被查詢了出來。
解題思路:
? ? ? ?1. 子查詢是按照park_id進(jìn)行分組,并使用sql函數(shù)min 拿取到每組中加入時間最小的時間min_joined_at。并行程臨時表tem
? ? ? ? 2. 根據(jù)拿取到的每個園區(qū)最小的加入時間關(guān)聯(lián)查詢,將其和customer表進(jìn)行關(guān)聯(lián),按照park_id相等,且用戶的加入時間于最小的加入時間min_joined_at相等來拿取對應(yīng)的數(shù)據(jù)。
??
總結(jié):由以上兩個操作觀察可知,
第一個方法更適合拿取按照條件進(jìn)行分組后數(shù)據(jù)有重復(fù),但我們僅取一條的需求?;蛘呤怯卸鄠€排序規(guī)則,我們按照多個排序規(guī)則進(jìn)行處理后,拿取其中最匹配的一條。需要注意的一點是oracle并不支持該種方法文章來源:http://www.zghlxwxcb.cn/news/detail-479474.html
方法二更適合按條件分組后沒有重復(fù)數(shù)據(jù),或者有重復(fù)數(shù)據(jù),且我們是要拿取所有符合條件的重復(fù)數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-479474.html
到了這里,關(guān)于Mysql 查詢分組數(shù)據(jù)中每組某一數(shù)值最大的數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!