MySQL计算某一个时间段的最大并发量

MySQL group by 统计每5分钟数据量
需求
有打卡记录表结构如下

ID user_id (int) create_time (int)
1 123 1603209599
现需要统计每5分钟的记录数量,按记录数量降序排列

分析
关键在于怎么把create_time按每5分钟分组,可以使用取模 % 实现

举例
现有时间戳 1 - 10 秒,每5秒分一组

首先对每秒跟5取模,结果如下

1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0
6 % 5 = 1
7 % 5 = 2
8 % 5 = 3
9 % 5 = 4
10 % 5 = 0
然后使用对应的秒数减去取模后的结果如下

1 - 1 % 5 # 0
2 - 2 % 5 # 0
3 - 3 % 5 # 0
4 - 4 % 5 # 0
5 - 5 % 5 # 5

6 - 6 % 5 # 5
7 - 7 % 5 # 5
8 - 8 % 5 # 5
9 - 9 % 5 # 5
10 - 10 % 5 # 10
没发现规律,那么把秒数增加到20秒

11 - 11 % 5; # 10
12 - 12 % 5; # 10
13 - 13 % 5; # 10
14 - 14 % 5; # 10
15 - 15 % 5; # 15

16 - 16 % 5; # 15
17 - 17 % 5; # 15
18 - 18 % 5; # 15
19 - 19 % 5; # 15
20 - 20 % 5; # 20
改写下公式

concat(create_time - create_time % 5, ‘~’, create_time - create_time % 5 + 5)
最终计算的结果结果如下

SELECT 1 - 1 % 5; # 0 (0 ~ 5)
SELECT 2 - 2 % 5; # 0 (0 ~ 5)
SELECT 3 - 3 % 5; # 0 (0 ~ 5)
SELECT 4 - 4 % 5; # 0 (0 ~ 5)
SELECT 5 - 5 % 5; # 5 (5 ~ 10)
SELECT 6 - 6 % 5; # 5 (5 ~ 10)
SELECT 7 - 7 % 5; # 5 (5 ~ 10)
SELECT 8 - 8 % 5; # 5 (5 ~ 10)
SELECT 9 - 9 % 5; # 5 (5 ~ 10)
SELECT 10 - 10 % 5; # 10 (10 ~ 15)
SELECT 11 - 11 % 5; # 10 (10 ~ 15)
SELECT 12 - 12 % 5; # 10 (10 ~ 15)
SELECT 13 - 13 % 5; # 10 (10 ~ 15)
SELECT 14 - 14 % 5; # 10 (10 ~ 15)
SELECT 15 - 15 % 5; # 15 (15 ~ 20)
SELECT 16 - 16 % 5; # 15 (15 ~ 20)
SELECT 17 - 17 % 5; # 15 (15 ~ 20)
SELECT 18 - 18 % 5; # 15 (15 ~ 20)
SELECT 19 - 19 % 5; # 15 (15 ~ 20)
SELECT 20 - 20 % 5; # 20 (20 ~ 25)
如此便能实现每5秒分到一组,要实现需求的每5分钟分组,只需要把5改成300,最终的SQL如下

select
concat(from_unixtime(create_time - create_time % 300), ’ ~ ', from_unixtime(create_time - create_time % 300 + 300)) as period,
count(1) as record_count
from 打卡日志表
WHERE create_time BETWEEN 1603123200 and 1603209599
group by period
order by record_count DESC;
每5分钟数量

我的补充:
#UNIX_TIMESTAMP 这个是讲日期转换成单位秒格式

select ly,max(record_count),period
from
(select date(h.insdt) ly,from_unixtime(UNIX_TIMESTAMP(insdt) - UNIX_TIMESTAMP(insdt) % 600) as period,count(1) as record_count
from ourydc_app_chat_room_enter_history h
where room_id = ‘332226034’
and h.insdt between ‘2021-01-20 21:00’ and ‘2021-01-20 22:00’
group by period) a;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值