mysql区间分组统计

场景:

表cases,有完成时间(finish_time),id等字段
现在将finish_time按时间区间划分年份
例 2021-11-01 00:00:00 ~2022-10-31 23:59:59 为2022年
下面是模拟数据:

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<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。

elt

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

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

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

建中间表

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

start_dateend_dateyear
2018-11-01 00:00:002019-10-31 23:59:592019
2019-11-01 00:00:002020-10-31 23:59:592020
2020-11-01 00:00:002021-10-31 23:59:592021
2021-11-01 00:00:002022-10-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`

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

通过函数来划分区间

创建函数get_year()

create function get_year(finishTime datetime) returns int
begin
    declare d_year int(4);
    set d_year = year(finishTime);
    if (finishTime >= concat(d_year, '-11-01 00:00:00')) then
        return d_year + 1;
    else
        return d_year;
    end if;
end;
	select count(*) as '数量',get_year(c.finish_ime) as "年份"
	from cases c 
	group by get_year(c.finish_ime)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值