mysql根据时间字段根据季度分组_SQL——按照季度,固定时间段,分组统计数据...

最近在工作中接到了一个需求,要求统计当月以10天为一个周期,每个周期的数据汇总信息。假设有一张表如下:

表table_test中

ID           AMOUNT         CREATE_DATE

1            50                     2017-01-01

2            50                     2017-01-09

3            50                     2017-01-11

4            50                     2017-01-19

5            50                     2017-01-21

6            50                     2017-01-22

7            50                     2017-01-24

相当于以CREATE_DATE为组条件,1 - 10,11 -20,21 - 月末,每一个时间段的AMOUNT字段的和。面对这个需求,首先想到的解决方案为以日期作为参数。使用代码传参重复调用,发现该方法效率极低,后来做出相应优化,使用 UNION ALL去调用 sql如下

1 SELECT SUM(AMOUT) AStotalAmount FORM TABLE_TEST2 WHERE CREATE_DATE BETWEEN '2017-01-01' AND '2017-01-10'

3 UNION ALL

4 SELECT SUM(AMOUT) AStotalAmount FORM TABLE_TEST5 WHERE CREATE_DATE BETWEEN '2017-01-11' AND '2017-01-20'

6 UNION ALL

7 SELECT SUM(AMOUT) AStotalAmount FORM TABLE_TEST8 WHERE CREATE_DATE BETWEEN '2017-01-21' AND '2017-01-30'

后来数据量大了后发现,效率有些跟不上。就想到了代替的优化SQL如下

1 SELECT

2 sum(amount) totalAmount,3 floor((day(CREATE_DATE) - day(NOW()))/10) ASTIMESAPN4 FROM

5 table_test6 where MONTH(create_date) = MONTH(now())7 GROUP BY

8 TIMESAPN --该sql为mysql语句,如果为其他数据库可替换为其他数据库函数

关键点在于:

floor((day(CREATE_DATE) - day(NOW()))/10) ASTIMESAPN

当 TIMESAPN 为 0 时则在第一个周期,为1则在第二个周期,以此类推,最后在以该字段为分组条件。完美解决效率问题。可以适当的想一下如果该需求改成按照季度统计。只需要截取日期的月份/4则可以完美解决。也就是说这个sql基本可以解决按照一段时间去统计的大部分需求。(该sql为博主自己想出来的,适用于本需求。如果有什么更好的解决方法可以留言。互相学习)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值