最近在工作中接到了一个需求,要求统计当月以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如下

 SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST
WHERE CREATE_DATE BETWEEN '2017-01-01' AND '2017-01-10'
UNION ALL
SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST
WHERE CREATE_DATE BETWEEN '2017-01-11' AND '2017-01-20'
UNION ALL
SELECT SUM(AMOUT) AS totalAmount FORM TABLE_TEST
WHERE CREATE_DATE BETWEEN '2017-01-21' AND '2017-01-30'

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

 SELECT
sum(amount) totalAmount,
floor((day(CREATE_DATE) - day(NOW()))/10) AS TIMESAPN
FROM
table_test
where MONTH(create_date) = MONTH(now())
GROUP BY
TIMESAPN --该sql为mysql语句,如果为其他数据库可替换为其他数据库函数

  关键点在于:

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

SQL——按照季度,固定时间段,分组统计数据的更多相关文章

  1. sql根据时间戳按年月日分组统计

    sql根据时间戳按年月日分组统计,用于按日期分类: create_time为时间格式(字段名create_time 根据自己表字段修改,数据库中存为201610071202) SELECT DATE_ ...

  2. 常用sql:按照表中的某一列对数据进行分组,统计数据条数

    select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...

  3. mysql按日期分组统计数据

    最近在做一个招聘网时,需要显示一个月内企业招聘信息的发布数量,按日期分组统计,刚开始是直接从源数据库表里面进行group by,但这样子就出现日期不连续的问题了,我想要的效果是,若当天没有数据,则显示 ...

  4. mysql按月,按日分组统计数据

    group by DATE_FORMAT(createtime,'%Y-%m');//按月统计数据 group by DATE_FORMAT(createtime,'%Y-%m-%d');//按天统计 ...

  5. Oracle按时间段分组统计

    想要按时间段分组查询,首先要了解level,connect by,oracle时间的加减. 关于level这里不多说,我只写出一个查询语句: ----level 是一个伪例 ---结果: 关于conn ...

  6. sql server 分组统计数据

    说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在sele ...

  7. sql server 以10分钟分组 统计人数

    请问针对时间段从每天早上7点开始统计每十分钟人 解决思路: 我以前做过一个关于月份的,是说每3个月以分组,其实是一样的.不过可能啊,整体数据量大会有问题.如果你只是求一天的,那绝对没问题.[1]如果只 ...

  8. Mysql按周,按月,按日,按小时分组统计数据

    按周   select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks;   ...

  9. mysql按天,按周,按月,按季度,按年统计数据

    /*查询2小时前的数据*/select * from tableName WHERE create_time HOUR) SELECT count(id) FROM rd_track_info WHE ...

随机推荐

  1. 在web中使用HTTPS

    背景 目前网上流行的是HTTP协议,HTTPS协议还在逐步推广的过程中. HTTP协议以明文发送内容,容易被攻击者窃听.HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份[ ...

  2. 逆向实用干货分享,Hook技术第一讲,之Hook Windows API

    逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...

  3. Codeforces 858A. k-rounding 数论

    题目: 题意:输入n和k,找到一个最小的数,满足末尾有至少k个0和是n的倍数. 最小的情况 ans = n,最大的情况 ans = n*pow(10,k). 令 k = pow(10,k); 我们发现 ...

  4. JPEG流封装AVI视频

    前言:前几天工作任务,要把JPEG流封装为AVI视频,就找了些AVI文件结构资料和示例代码研究了下,现将学习总结及最终完成的可用代码分享出来,由于本人也是现学现用,如有不恰当或错误之处,欢迎提出! 1 ...

  5. leetCode没那么难啦 in Java (二)

    介绍    本篇介绍的是标记元素的使用,很多需要找到正确元素都可以将正确元素应该插入的位置单独放置一个标记来记录,这样可以达到原地排序的效果. Start 27.RemoveElement 删除指定元 ...

  6. Flip Game poj 1753

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29731   Accepted: 12886 Descr ...

  7. js自执行函数写法

    (1)写法1 (function(){ //函数内容 })() (2)写法2 (function(){ //函数内容 }())

  8. C#利用String类的IndexOf、LastIndexOf、Substring截取字符串

    一.String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引(从0开始).搜索从指定字符位置开始,并检查指定 ...

  9. 容器中使用iptables报错can't initialize iptables table Permission denied (you must be root)

    背景 在docker容器中部署了一微服务,该服务需要docker push镜像到docker registry.因此,docker容器中需要安装docker服务.但在启动容器的时候,却报错: can' ...

  10. bind、apply与call

    bind.apply与call 先说观点:不论是bind.apply还是call,最大的好处就是代码复用. bind 在开发中,我们只有复用代码时,才会出现this指向需要改动的情况. 纵观bind的 ...