后端开发 - mysql按时间分段统计的sql语句怎么写好?
问题描述
我的数据库表结构如下:
字段分别是ID,NUM1,NUM2, TIME1,TIME2, MONEY.
想要按照15分钟为间隔来统计ID的数量。效果如同下面的sql语句。
SELECT sum(CASE when TIME1 >= ’2014-02-27 8:00:00’ and TIME1 < ’2014-02-27 8:15:00’ then 1 else 0 end) AS ’1’, sum(CASE when TIME1 >= ’2014-02-27 8:15:00’ AND TIME1 < ’2014-02-27 8:30:00’ then 1 else 0 end) AS ’2’, sum(CASE when TIME1 >= ’2014-02-27 8:30:00’ AND TIME1 < ’2014-02-27 8:45:00’ then 1 else 0 end) AS ’3’, sum(CASE when TIME1 >= ’2014-02-27 8:45:00’ AND TIME1 < ’2014-02-27 9:00:00’ then 1 else 0 end) AS ’4’, sum(CASE when TIME1 >= ’2014-02-27 9:00:00’ and TIME1 < ’2014-02-27 9:15:00’ then 1 else 0 end) AS ’5’ from dealdata;
但是像上面那么写重复代码多,并且如果我改成30分钟的话,就要改动很多,所以求助sql大神,看有什么好的方法。
———————————————————————————————————分割线————————————————————————————————————
谢谢 arm 同志的帮助,现在能查询出现了
count(id)就是进站的人但是有的时间段,根本没有进站的人,所以有的时间段没有,例如5:00 -- 5:15 如果要将没有进站的人的时间段 补全为0,该怎么做呢?
问题解答
回答1:谢邀,可以纵向排列的化,如下
SELECT count(id)from dealdatawhere timestampdiff(minute,’2014-02-27 9:15:00’,`TIME1`)<0 and timestampdiff(minute,’2014-02-27 8:00:00’,`TIME1`)>=0group by floor(timestampdiff(minute,’2014-02-27 8:00:00’,`TIME1`)/15)
where 限制时间段,group by里面除以你需要的时间间隔。我不知道你为什么出错,可能和mysql版本有关,我是mysql5.6
SELECT count(*),floor(timestampdiff(minute,’2017-1-18 16:00:00’,`time`)/30),date_add(’2017-1-18 16:00:00’,interval 30*floor(timestampdiff(minute,’2017-1-18 16:00:00’,`time`)/30) MINUTE)FROM 我是马赛克.我是马赛克group by floor(timestampdiff(minute,’2017-1-18 16:00:00’,`time`)/30)
结果看了下,跑的还是蛮快的,0.3s不到
列数不定啊,真的定义不少变量
回答3:脚本驱动MySQL ,定制一个变量。也许有更好的办法,我就闲的回答了下
相关文章:
1. javascript - vue 移动端的input 数字输入优化2. java - mongodb分片集群下,count和聚合统计问题3. java - 自己制作一个视频播放器,遇到问题,用的是内置surfaceview类,具体看代码!4. android - java 泛型不支持数组,那么RxJava的Map集合有什么方便的手段可以定义获得一串共同父类集合数据呢?5. 服务器端 - 采用nginx做web服务器,C++开发应用程序 出现拒绝连接请求?6. 为什么我ping不通我的docker容器呢???7. 关于docker下的nginx压力测试8. python - pandas按照列A和列B分组,将列C求平均数,怎样才能生成一个列A,B,C的dataframe9. javascript - 有什么兼容性比较好的办法来判断浏览器窗口的类型?10. java - 静态属性中的赋值和静态代码块中的赋值有什么区别?
