最近在工作中接到了一个需求,要求统计当月以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. react基础(2)

    react基础(1):介绍了如何创建项目,总结了JSX.组件.样式.事件.state.props.refs.map循环,另外还讲了mock数据和ajax 还是用 react基础1 里创建的项目继续写案 ...

  2. pmap 命令详解

    通过查看帮助,返回了如下信息: Usage:  pmap [options] pid [pid ...] Options: -x, --extended              show detai ...

  3. Redis介绍——Linux环境Redis安装全过程和遇到的问题及解决方案

    一:redis的入门介绍: 首先贴出官网; 英文:https://redis.io/ 中文:http://www.redis.cn/ 1.是什么 --REmote DIctionary Server( ...

  4. localStorage和sessionStorage总结以及区别

    (1)兼容的手机和浏览器: (2)使用 .setItem( key, value)存键值数据 sessionStorage.setItem("key","value&qu ...

  5. rem绝对自适应方案

    rem css3新增的rem是现在非常受欢迎的单位.看一下MDN上的说明: 这个单位代表根元素的 font-size 大小(例如 <html> 元素的font-size). 使用这个单位可 ...

  6. git fsck -- 一致性检查

    格式:           git fsck  [选项] <path> 选项 git commit -a 提交所有改动的文件(a -- all) git commit -m 提交说明(m ...

  7. Promise 对象

    Promise 对象用于处理异步请求,保存一个异步操作最终完成(或失败)的结果 语法 new Promise( /* executor */ function(resolve, reject) {.. ...

  8. JAVA提高四:反射基本应用

    在前面一节<http://www.cnblogs.com/pony1223/p/7659210.html>,我们学习了JAVA的反射的相关知识,那么本节我们对前面所学习的知识做一个应用相关 ...

  9. SimpleDateFormat时间格式化存在线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  10. 字符串解码DecodeString

    字符串解码 原创博客,转载请注明出处!eg:ss=2[abc]3[cd]ef   return:abcabccdcdcdefss=3[a2[c]]2[a]    return:accaccaccaas ...