【工作记录】mysql中实现分组统计的三种方式

前言

实际工作中对范围分组统计的需求还是相对普遍的,本文记录下在mysql中通过函数和sql完成分组统计的实现过程。

数据及期望

比如我们获取到了豆瓣电影top250,现在想知道各个分数段的电影总数.

表数据如下:

期望结果:

实现方案

主要思路是根据score的范围设置别名,然后按照别名统计即可。

方案一:

sql 复制代码
select tmp.level, count(1) as cnt from
    (select
        score,
        case
            when 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 level
    from `douban_movie_top250` limit 20 ) tmp
group by tmp.level
order by tmp.level asc

方案二:

mysql 复制代码
select
    case tmp.level
        when 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()函数介绍

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

我们直接查询下这个函数使用的结果验证下:

sql 复制代码
select score, interval(score, 7, 8, 8.5, 9, 9.5) as level 
from `douban_movie_top250` limit 20

结果如下:

可以看到验证结果是正确的,依据这个特性还是可以做不少事情的。

方案三:

sql 复制代码
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 level
	from `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是要判断的数值,如果N=1,则返回str1,如果N=2,则返回str2,以此类推。

总结

本文针对分组统计提出了三种实现方式,各有优劣吧。

针对以上内容有任何疑问或者建议欢迎留言评论~

创作不易,欢迎一键三连~~~

相关推荐
IT19955 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
paopaokaka_luck8 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
lzhdim9 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
这个DBA有点耶12 小时前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
程序员塔塔喵13 小时前
【MySQL篇|第三篇】脏读,幻读,不可重复读
数据库·mysql·不可重复读·幻读·脏读
这个DBA有点耶13 小时前
备份成功≠数据可恢复:静默损坏会让物理备份把坏页一起带走
数据库·mysql·代码规范
数据库小学妹13 小时前
MySQL MDL锁等待排查:DDL卡住与长事务定位
数据库·后端·mysql
lhdz_bj14 小时前
Mysql Server配置详解
mysql·配置·file·config·1024程序员节·option·选项
syagain_zsx17 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
时间售卖铺17 小时前
MySQL 备份
运维·数据库·mysql·云原生