当前位置: 首页 > news >正文

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

前言

实际工作中对范围分组统计的需求还是相对普遍的,本文记录下在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 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

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

select score, interval(score, 7, 8, 8.5, 9, 9.5) as level 
from `douban_movie_top250` limit 20

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

方案三:

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

总结

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

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

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

http://www.lryc.cn/news/123559.html

相关文章:

  • 马来西亚的区块链和NFT市场调研
  • [保研/考研机试] KY109 Zero-complexity Transposition 上海交通大学复试上机题 C++实现
  • Linux零基础快速入门到精通
  • ARM02汇编指令
  • 从初学者到专家:Java方法的完整指南
  • 【生成式AI】ProlificDreamer论文阅读
  • C++元编程——模拟javascript异步执行
  • 【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL
  • Springboot 默认路径说明
  • springboot注册拦截器与返回统一标准响应格式
  • 卷王特斯拉又全网降价了,卷死车企们
  • wiley:revision 流程
  • 【论文阅读】基于深度学习的时序预测——Pyraformer
  • 玩转IndexedDB,比localStorage、cookie还要强大的网页端本地缓存
  • RedisDesktopManager连不上redis问题解决(小白版)
  • 蓝帽杯 取证2022
  • MyBatis and or使用列表控制or条件
  • C语言刷题训练【第11天】
  • 正则表达式的使用
  • PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串
  • linux内核bitmap之setbit汇编实现
  • Golang设计模式
  • leetcode151. 反转字符串中的单词
  • 【BASH】回顾与知识点梳理(十七)
  • 时序预测-Informer简介
  • 2023牛客第七场补题报告C F L M
  • Android使用kotlin+协程+room数据库的简单应用
  • Kubernetes pod调度约束[亲和性 污点] 生命阶段 排障手段
  • Matlab实现模拟退火算法(附上多个完整源码)
  • 前后端分离------后端创建笔记(03)前后端对接(上)