栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mysql区间分组统计

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mysql区间分组统计

场景:

表cases,有完成时间(finish_time),id等字段
现在将finish_time按年份划分区间
下面是模拟数据:

idfinish_time
12019-01-23 23:23:23
22019-02-28 12:12:12
32020-08-12 08:12:12
42021-05-12 22:12:43
52022-05-12 23:23:23

统计结果应该如下所示:

年份数量
20192
20201
20211
20221

因为不能在cases表中添加字段,上网搜寻后找到两个方法:

  1. 利用了mysql提供的interval和elt函数实现了效果。
  2. 是建一张中间表用来分组
利用了mysql提供的interval和elt函数实现了效果 interval

interval(N,N1,N2,N3) ,比较列表中的N值,该函数如果N elt

elt(n,str1,str2,str3,…) 如果n=1,则返回str1,如果n=2,则返回str2,依次类推
两个函数结合,再加上group,实现了这种范围分组的效果

select elt(interval(finish_ime,'2019-01-01','2020-01-01-'2021-01-01','2022-01-01'),2019,2020,2021,2022) as i,count(*)
from cases
group by i

但实际效果不尽人意,也许是因为mysql中interval也是处理日期的关键字吧,interval()函数对日期进行划分的时候每次都划分到最后一个区间,因此使用第二种办法即建一张中间表用来划分

建中间表

创建如下一张中间表(tmp)

start_dateend_dateyear
2019-01-01 00:00:002019-12-31 23:59:592019
2020-01-01 00:00:002020-12-31 23:59:592020
2021-01-01 00:00:002021-12-31 23:59:592021
2022-01-01 00:00:002022-12-31 23:59:592022

cases表通过join连接这张表就可以实现分组效果

	select count(*) as '数量', t.`year` as "年份"
	from cases c left join tmp t on c.finish_time>=t.start_date and 
									c.finish_time<=t.end_date 
	group by t.`year`

这样就可以在不修改原有表结构的基础上实现区间分组统计。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995369.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号