mysql按时间分段统计的sql语句怎么写好?

发布于 2022-09-04 23:29:27 字数 1441 浏览 15 评论 0

我的数据库表结构如下:

clipboard.png

字段分别是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;

clipboard.png

但是像上面那么写重复代码多,并且如果我改成30分钟的话,就要改动很多,所以求助sql大神,看有什么好的方法。

———————————————————————————————————分割线————————————————————————————————————

谢谢 arm 同志的帮助,现在能查询出现了

clipboard.png

count(id)就是进站的人
但是有的时间段,根本没有进站的人,所以有的时间段没有,例如5:00 -- 5:15
如果要将没有进站的人的时间段 补全为0,该怎么做呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

腹黑女流氓 2022-09-11 23:29:28

脚本驱动MySQL ,定制一个变量。也许有更好的办法,我就闲的回答了下?

兲鉂ぱ嘚淚 2022-09-11 23:29:27

谢邀,可以纵向排列的化,如下

SELECT count(id)
from dealdata
where timestampdiff(minute,'2014-02-27 9:15:00',`TIME1`)<0 and timestampdiff(minute,'2014-02-27 8:00:00',`TIME1`)>=0
group 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)

结果
clipboard.png
看了下,跑的还是蛮快的,0.3s不到

我可以呀,你可以参考下

CREATE TEMPORARY TABLE spliteTimeZone(zoneNum INT);

clipboard.png

select date_add('2017-1-18 16:00:00',interval 15*a.zoneNum MINUTE) ZoneBegin ,b.cnt
from spliteTimeZone a left join(
    SELECT count(*) cnt,
    floor(timestampdiff(minute,'2017-1-18 16:00:00',`time`)/15) zoneNum
    FROM fm360u03u05.ptr_cp1_v6_1_08
    group by floor(timestampdiff(minute,'2017-1-18 16:00:00',`time`)/15)
    order by `time`
) b on a.zoneNum = b.zoneNum

clipboard.png

戏剧牡丹亭 2022-09-11 23:29:27

列数不定啊,真的定义不少变量

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文