娱乐网站怎么制作,免费的网站域名查询565wcc,服务器安全狗,aspit网站源码带手机版前言
实际工作中对范围分组统计的需求还是相对普遍的#xff0c;本文记录下在mysql中通过函数和sql完成分组统计的实现过程。
数据及期望
比如我们获取到了豆瓣电影top250#xff0c;现在想知道各个分数段的电影总数.
表数据如下: 期望结果:
实现方案
主要思路是根据s…前言
实际工作中对范围分组统计的需求还是相对普遍的本文记录下在mysql中通过函数和sql完成分组统计的实现过程。
数据及期望
比如我们获取到了豆瓣电影top250现在想知道各个分数段的电影总数.
表数据如下: 期望结果:
实现方案
主要思路是根据score的范围设置别名然后按照别名统计即可。
方案一:
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 ascINTERVAL()函数介绍 INTERVAL()函数可以返回分段后的结果语法如下 INTERVAL(N,N1,N2,N3,…) 其中N是要判断的数值N1,N2,N3,…是分段的间隔。 sql中用到了interval函数interval(score, 7, 8, 8.5, 9, 9.5)返回的是score所处阶段的索引比如返回1代表score在[7,8)范围内前闭后开依次类推。
分数段对应值[7,8)1[8,8.5)2[8.5,9)3[9,9.5)4[9.5,10)5
我们直接查询下这个函数使用的结果验证下
select score, interval(score, 7, 8, 8.5, 9, 9.5) as level
from douban_movie_top250 limit 20结果如下: 可以看到验证结果是正确的依据这个特性还是可以做不少事情的。
方案三
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函数和interval函数大致可以猜测到elt函数做的事情就是上面方案二中case…when…做的事情。 ELT函数简介 ELT()函数是分值函数功能有点类似很多编程语言中的switch关键字。 语法 ELT(N,str1,str2,str3,…) 其中N是要判断的数值如果N1则返回str1如果N2则返回str2以此类推。 总结
本文针对分组统计提出了三种实现方式各有优劣吧。
针对以上内容有任何疑问或者建议欢迎留言评论~
创作不易欢迎一键三连~~~