SQL——按照季度,固定时间段,分组统计数据
最近在工作中接到了一个需求,要求统计当月以10天为一个周期,每个周期的数据汇总信息。假设有一张表如下:
表table_test中
IDAMOUNTCREATE_DATE
1502017-01-01
2502017-01-09
3502017-01-11
4502017-01-19
【SQL——按照季度,固定时间段,分组统计数据】5502017-01-21
6502017-01-22
7502017-01-24
相当于以CREATE_DATE为组条件,1 - 10,11 -20,21 - 月末,每一个时间段的AMOUNT字段的和。面对这个需求,首先想到的解决方案为以日期作为参数。使用代码传参重复调用,发现该方法效率极低,后来做出相应优化,使用 UNION ALL 去调用 sql如下
1 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 2 WHERE CREATE_DATE BETWEEN '2017-01-01' AND '2017-01-10' 3 UNION ALL 4 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 5 WHERE CREATE_DATE BETWEEN '2017-01-11' AND '2017-01-20' 6 UNION ALL 7 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST 8 WHERE CREATE_DATE BETWEEN '2017-01-21' AND '2017-01-30'
后来数据量大了后发现,效率有些跟不上。就想到了代替的优化SQL如下
1 SELECT 2sum(amount) totalAmount, 3floor((day(CREATE_DATE) - day(NOW()))/10) AS TIMESAPN 4 FROM 5table_test 6 where MONTH(create_date) = MONTH(now()) 7 GROUP BY 8TIMESAPN --该sql为mysql语句,如果为其他数据库可替换为其他数据库函数
关键点在于:
floor((day(CREATE_DATE) - day(NOW()))/10) AS TIMESAPN
当 TIMESAPN 为 0 时则在第一个周期,为1则在第二个周期,以此类推,最后在以该字段为分组条件。完美解决效率问题。可以适当的想一下如果该需求改成按照季度统计。只需要截取日期的月份/4则可以完美解决。也就是说这个sql
基本可以解决按照一段时间去统计的大部分需求。(该sql为博主自己想出来的,适用于本需求。如果有什么更好的解决方法可以留言。互相学习)
转载于:https://www.cnblogs.com/Caucasian/p/7790024.html
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术