集團(tuán)企業(yè)網(wǎng)站建設(shè)屬于seo網(wǎng)站優(yōu)化
前言
實(shí)際工作中對范圍分組統(tǒng)計(jì)的需求還是相對普遍的,本文記錄下在mysql中通過函數(shù)和sql完成分組統(tǒng)計(jì)的實(shí)現(xiàn)過程。
數(shù)據(jù)及期望
比如我們獲取到了豆瓣電影top250,現(xiàn)在想知道各個分?jǐn)?shù)段的電影總數(shù).
表數(shù)據(jù)如下:
期望結(jié)果:
實(shí)現(xiàn)方案
主要思路是根據(jù)score的范圍設(shè)置別名,然后按照別名統(tǒng)計(jì)即可。
方案一:
select tmp.level, count(1) as cnt from(selectscore,casewhen score >= 7 and score < 8 then '[7,8)'when score >= 8 and score < 8.5 then '[8,8.5)'when score >= 8.5 and score < 9 then '[8.5,9)'when score >= 9 and score < 9.5 then '[9,9.5)'when score >= 9.5 and score < 10 then '[9.5,10)'end as levelfrom `douban_movie_top250` limit 20 ) tmp
group by tmp.level
order by tmp.level asc
方案二:
selectcase tmp.levelwhen 1 then '[7,8)'when 2 then '[8,8.5)'when 3 then '[8.5,9)'when 4 then '[9,9.5)'when 5 then '[9.5,10)'end as level, count(1) as cnt
from(select score, interval(score, 7, 8, 8.5, 9, 9.5) as level from `douban_movie_top250` limit 20) tmp
group by tmp.level
order by tmp.level asc
INTERVAL()函數(shù)介紹
INTERVAL()函數(shù)可以返回分段后的結(jié)果,語法如下:
? INTERVAL(N,N1,N2,N3,…)
其中,N是要判斷的數(shù)值,N1,N2,N3,…是分段的間隔。
sql中用到了interval
函數(shù),interval(score, 7, 8, 8.5, 9, 9.5)
返回的是score所處階段的索引,比如返回1代表score在[7,8)范圍內(nèi),前閉后開,依次類推。
分?jǐn)?shù)段 | 對應(yīng)值 |
---|---|
[7,8) | 1 |
[8,8.5) | 2 |
[8.5,9) | 3 |
[9,9.5) | 4 |
[9.5,10) | 5 |
我們直接查詢下這個函數(shù)使用的結(jié)果驗(yàn)證下:
select score, interval(score, 7, 8, 8.5, 9, 9.5) as level
from `douban_movie_top250` limit 20
結(jié)果如下:
可以看到驗(yàn)證結(jié)果是正確的,依據(jù)這個特性還是可以做不少事情的。
方案三:
select level, count(1) as cnt from (select score, elt(interval(score, 7, 8, 8.5, 9, 9.5), '[7,8)','[8,8.5)', '[8.5,9)', '[9,9.5)','[9.5,10)') as levelfrom `douban_movie_top250` limit 20) tmp
group by tmp.level order by tmp.level asc;
這個sql中用到了elt
函數(shù)和interval
函數(shù),大致可以猜測到elt函數(shù)做的事情就是上面方案二中case…when…做的事情。
ELT函數(shù)簡介
? ELT()函數(shù)是分值函數(shù),功能有點(diǎn)類似很多編程語言中的switch關(guān)鍵字。
語法:
? ELT(N,str1,str2,str3,…)
其中N是要判斷的數(shù)值,如果N=1,則返回str1,如果N=2,則返回str2,以此類推。
總結(jié)
本文針對分組統(tǒng)計(jì)提出了三種實(shí)現(xiàn)方式,各有優(yōu)劣吧。
針對以上內(nèi)容有任何疑問或者建議歡迎留言評論~
創(chuàng)作不易,歡迎一鍵三連~~~