备注:测试数据库版本为MySQL 8.0

测试数据准备:

drop table trx_log;

create table trx_log(trx_id int,trx_date timestamp,trx_cnt int);

insert into trx_log values (1,'2020-10-28 19:03:07',44);

insert into trx_log values (2,'2020-10-28 19:03:08',18);

insert into trx_log values (3,'2020-10-28 19:03:09',23);

insert into trx_log values (4,'2020-10-28 19:03:10',29);

insert into trx_log values (5,'2020-10-28 19:03:11',27);

insert into trx_log values (6,'2020-10-28 19:03:12',45);

insert into trx_log values (7,'2020-10-28 19:03:13',45);

insert into trx_log values (8,'2020-10-28 19:03:14',32);

insert into trx_log values (9,'2020-10-28 19:03:15',41);

insert into trx_log values (10,'2020-10-28 19:03:16',15);

insert into trx_log values (11,'2020-10-28 19:03:17',24);

insert into trx_log values (12,'2020-10-28 19:03:18',47);

insert into trx_log values (13,'2020-10-28 19:03:19',37);

insert into trx_log values (14,'2020-10-28 19:03:20',48);

insert into trx_log values (15,'2020-10-28 19:03:21',46);

insert into trx_log values (16,'2020-10-28 19:03:22',44);

insert into trx_log values (17,'2020-10-28 19:03:23',36);

insert into trx_log values (18,'2020-10-28 19:03:24',41);

insert into trx_log values (19,'2020-10-28 19:03:25',33);

insert into trx_log values (20,'2020-10-28 19:03:26',19);1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

一.需求

按照某个时间间隔计算数据的和。

例如,有一个事务处理日志,想求得每5秒钟内的总事务数。

表trx_log 总的行如下所示:

mysql> select trx_id,

-> trx_date,

-> trx_cnt

-> from trx_log;

±-------±--------------------±--------+

| trx_id | trx_date | trx_cnt |

±-------±--------------------±--------+

| 1 | 2020-10-28 19:03:07 | 44 |

| 2 | 2020-10-28 19:03:08 | 18 |

| 3 | 2020-10-28 19:03:09 | 23 |

| 4 | 2020-10-28 19:03:10 | 29 |

| 5 | 2020-10-28 19:03:11 | 27 |

| 6 | 2020-10-28 19:03:12 | 45 |

| 7 | 2020-10-28 19:03:13 | 45 |

| 8 | 2020-10-28 19:03:14 | 32 |

| 9 | 2020-10-28 19:03:15 | 41 |

| 10 | 2020-10-28 19:03:16 | 15 |

| 11 | 2020-10-28 19:03:17 | 24 |

| 12 | 2020-10-28 19:03:18 | 47 |

| 13 | 2020-10-28 19:03:19 | 37 |

| 14 | 2020-10-28 19:03:20 | 48 |

| 15 | 2020-10-28 19:03:21 | 46 |

| 16 | 2020-10-28 19:03:22 | 44 |

| 17 | 2020-10-28 19:03:23 | 36 |

| 18 | 2020-10-28 19:03:24 | 41 |

| 19 | 2020-10-28 19:03:25 | 33 |

| 20 | 2020-10-28 19:03:26 | 19 |

±-------±--------------------±--------+

要返回如下结果集:

±-----±--------------------±--------------------±------+

| grp | trx_start | trx_end | total |

±-----±--------------------±--------------------±------+

| 62 | 2020-10-28 19:03:07 | 2020-10-28 19:03:11 | 141 |

| 63 | 2020-10-28 19:03:12 | 2020-10-28 19:03:16 | 178 |

| 64 | 2020-10-28 19:03:17 | 2020-10-28 19:03:21 | 202 |

| 65 | 2020-10-28 19:03:22 | 2020-10-28 19:03:26 | 173 |

±-----±--------------------±--------------------±------+

二.解决方案

把所有项分组成每5行1桶。

有很多方式可实现这种逻辑分组;本节采用了trx_id除以5的技巧。

一旦创建了"组",就可以使用拘谨函数min、max和sum求起始时间、结束时间及每个"组"的事务处理总数。

select ceil(trx_id/5.0) as grp, min(trx_date) as trx_start, max(trx_date) as trx_end, sum(trx_cnt) as total

from trx_log

group by ceil(trx_id/5.0);1

2

3

4

5

6

测试记录:

mysql> select ceil(trx_id/5.0) as grp, -> min(trx_date) as trx_start, -> max(trx_date) as trx_end, -> sum(trx_cnt) as total -> from trx_log -> group by ceil(trx_id/5.0);

+------+---------------------+---------------------+-------+

| grp | trx_start | trx_end | total |

+------+---------------------+---------------------+-------+

| 1 | 2020-10-28 19:03:07 | 2020-10-28 19:03:11 | 141 |

| 2 | 2020-10-28 19:03:12 | 2020-10-28 19:03:16 | 178 |

| 3 | 2020-10-28 19:03:17 | 2020-10-28 19:03:21 | 202 |

| 4 | 2020-10-28 19:03:22 | 2020-10-28 19:03:26 | 173 |

+------+---------------------+---------------------+-------+

4 rows in set (0.00 sec)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

那么此时你有疑问了,如果id值没有这么均匀,怎么处理呢?

其实可以根据将 时间转换为数字,除5之后向上取整。

这个例子我采用截取 分和秒转化为数字然后再除5,如时间分布跨度大,可以增加 年月日以及小时。

-- 对时间段进行分组

SELECT trx_id, trx_date, trx_cnt, ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0) grp

from trx_log;

mysql> SELECT trx_id, -> trx_date, -> trx_cnt, -> ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0) grp -> from trx_log;

+--------+---------------------+---------+------+

| trx_id | trx_date | trx_cnt | grp |

+--------+---------------------+---------+------+

| 1 | 2020-10-28 19:03:07 | 44 | 62 |

| 2 | 2020-10-28 19:03:08 | 18 | 62 |

| 3 | 2020-10-28 19:03:09 | 23 | 62 |

| 4 | 2020-10-28 19:03:10 | 29 | 62 |

| 5 | 2020-10-28 19:03:11 | 27 | 62 |

| 6 | 2020-10-28 19:03:12 | 45 | 63 |

| 7 | 2020-10-28 19:03:13 | 45 | 63 |

| 8 | 2020-10-28 19:03:14 | 32 | 63 |

| 9 | 2020-10-28 19:03:15 | 41 | 63 |

| 10 | 2020-10-28 19:03:16 | 15 | 63 |

| 11 | 2020-10-28 19:03:17 | 24 | 64 |

| 12 | 2020-10-28 19:03:18 | 47 | 64 |

| 13 | 2020-10-28 19:03:19 | 37 | 64 |

| 14 | 2020-10-28 19:03:20 | 48 | 64 |

| 15 | 2020-10-28 19:03:21 | 46 | 64 |

| 16 | 2020-10-28 19:03:22 | 44 | 65 |

| 17 | 2020-10-28 19:03:23 | 36 | 65 |

| 18 | 2020-10-28 19:03:24 | 41 | 65 |

| 19 | 2020-10-28 19:03:25 | 33 | 65 |

| 20 | 2020-10-28 19:03:26 | 19 | 65 |

+--------+---------------------+---------+------+

20 rows in set (0.00 sec)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

分组完成后,直接就可以进行聚合运算了

SELECT ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0) grp, min(trx_date) as trx_start, max(trx_date) as trx_end, sum(trx_cnt) as total

from trx_log

group by ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0)

;1

2

3

4

5

6

7

测试记录

mysql> SELECT ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0) grp, -> min(trx_date) as trx_start, -> max(trx_date) as trx_end, -> sum(trx_cnt) as total -> from trx_log -> group by ceil(DATE_FORMAT(TIMESTAMPADD(second,-1,trx_date),'%i%s')/5.0) -> ;

+------+---------------------+---------------------+-------+

| grp | trx_start | trx_end | total |

+------+---------------------+---------------------+-------+

| 62 | 2020-10-28 19:03:07 | 2020-10-28 19:03:11 | 141 |

| 63 | 2020-10-28 19:03:12 | 2020-10-28 19:03:16 | 178 |

| 64 | 2020-10-28 19:03:17 | 2020-10-28 19:03:21 | 202 |

| 65 | 2020-10-28 19:03:22 | 2020-10-28 19:03:26 | 173 |

+------+---------------------+---------------------+-------+

4 rows in set (0.00 sec)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

文章来源: blog.csdn.net,作者:只是甲,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/u010520724/article/details/113935397

mysql 时间段分组,MySQL 按时间单位进行分组相关推荐

  1. mysql date_format 按不同时间单位进行分组统计

    DATE_FORMAT(date,format)    根据format字符串格式化date值.下列修饰符可以被用在format字符串中:    %M     月名字(January--Decembe ...

  2. 3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束

     1 连接MYSQL服务器:mysql–uroot –p123456 查看中文问题 show variables like 'character%'; 2 修改mysql的字符集,退出mysql提 ...

  3. mysql select time,MySql查询时间段的方法

    本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面为您介绍两种MySql查询时间段的方法,供大家参考. MySql的时间字段有 ...

  4. mysql支持的时区列表_mysql按天分组支持时区

    时区问题总是个比较麻烦的问题,客户端与服务器的时区不一致自然是理所当然的事情,而对于多台服务器或者分布式再或者炙手可热的云,时区不统一也很正常,而且也不需要统一,还好有个时间戳的概念,通过时间戳就可以 ...

  5. mysql 时间段内的周末_淘宝用户行为数据分析(MySQL)

    利用MySQL对淘宝用户行为数据进行分析.分析步骤如下: 1 提出问题 2 理解数据 3 数据清洗 4 构建模型 5 结论 6 建议 淘宝是目前国内最大的电商平台,人们网购的主要渠道之一.买家通过搜索 ...

  6. mysql:列类型之时间日期

    环境: window10 vs2022 .net 6 mysql 8.0.25 DBeaver 参考: <MSDN:浮点数值类型(C# 引用)> <mysql:11.2 Date a ...

  7. 【MySQL】MySQL中的日期和时间函数有哪些?元宵节杭州灯光烟花秀你去看了吗?

    日期函数 元宵节灯光秀 时间和日期函数 获取当前日期的函数和获取当前时间的函数 获取当前日期函数 UNIX时间戳函数 返回UTC日期的函数和返回UTC时间的函数 获取月份的函数MONTH(date)和 ...

  8. mysql修改字段为现在时间_mysql如何修改字段自动生成时间

    mysql修改字段自动生成时间的方法:1.添加CreateTime设置默认时间:2.修改CreateTime设置默认时间:3.添加UpdateTime设置默认时间. 本教程操作环境:windows7系 ...

  9. MySQL中的日期和时间类型

    文章目录 1 MySQL中的日期和时间类型 1 MySQL中的日期和时间类型 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型.其中,YEAR类型表示年, ...

最新文章

  1. 国信优易首席科学家周涛:大数据的商业应用
  2. Linux挂载卸载光盘实践
  3. uploadify 上传
  4. 蚂蚁金服对研发高要求的领域建模能力是指什么?
  5. 【FLASH BUILDER 4.6 快捷键】只记几个对自己有帮助的
  6. C++中函数模板template和函数参数为指针,且有返回值的结合使用
  7. 实用知识点梳理:网络传输介质、以太网、VLAN、HDLC、奈奎斯特定理与香农定理
  8. mac SecureCRT设置
  9. PostgreSQL开放自由
  10. C++网络编程快速入门(二):Linux下使用select演示简单服务端程序
  11. Spring Boot中通过Accept-Language头信息设置国际化内容
  12. python画二维图_使用python绘制二维图形示例
  13. php传输数据arduino,Arduino如何和php,html文件一起使用?
  14. Ubuntu下安装NetBeans步骤和相关问题的解决方法
  15. 论文引用文献并插入编号
  16. python里end的用法_python不换行之end=与逗号的意思及用途
  17. java lpad oracle_oracle函数lpad的简单用法
  18. File-backed Storage
  19. 货币政策新款“奥利给”:普惠小微企业信贷支持计划的制约与动力
  20. vue3之语法糖script setup的父子组件、兄弟组件传值

热门文章

  1. android菜单回弹,Android--实现ViewPager边界回弹效果(转)
  2. fast无线网卡linux驱动,fast FW150US USB无线网卡Linux驱动安装
  3. Openwhisk之 -- 创建基于Docker的Action
  4. Rstudio读取csv文件
  5. 多少鸿蒙冰心对无间,鸿蒙造句
  6. 纯CSS实现文字通知无缝衔接无限循环滚动
  7. Excel发货单计算器,实现新增行后,新增行自动求和和列自动汇总求和
  8. 排班算法 java_【算法】基于优先级的排班算法实现
  9. 零基础小白,学UI设计能找到高薪工作吗?
  10. 淘宝数据魔方技术架构解析读后感