业务场景
MySQL按小时分组统计日志记录数量。最近需要统计一些日志流水,统计出打卡的高峰期,所以需要对日志流水按小时进行分组统计,统计出每半小时或者每小时内的打卡次数
按小时统计
这里使用DATE_FORMAT
函数,然后再根据createTime
进行分组,就可以统计每个小时内的打卡次数
SELECT
device_id,
DATE_FORMAT(
create_time,
'%Y-%m-%d %H:00:00'
) AS createTime,
count(*) AS num
FROM
t_user_atten_record
WHERE
com_id = 1111699
GROUP BY
device_id, createTime
ORDER BY
device_id, createTime;
每小时分组统计结果:
每半小时统计
要统计每半小时内的打卡次数,可以使用,MINUTE
先获取对应日期的分钟,半小时就是30分钟,floor(MINUTE(create_time) / 30)
是进行四舍五入计算,再乘以30
,floor(MINUTE(create_time) / 30) * 30
就是按30分钟归类为一组,同理再进行group by
分组统计
SELECT
device_id,
DATE_FORMAT(
concat(
date(create_time),
' ',
HOUR (create_time),
':',
floor(MINUTE(create_time) / 30) * 30
),
'%Y-%m-%d %H:%i'
) AS createTime,
count(*) AS num
FROM
t_user_atten_record
WHERE
com_id = 1111699
GROUP BY
device_id, createTime
ORDER BY
device_id, createTime;
每半小时分组统计结果:
基于此,还可以继续拓展,按每N分钟、每分钟、每天进行分组统计
每N分钟统计
前面是按照半小时(30分钟),依此类推,可以按n分钟进行分组统计,统计n分钟内的打卡次数,比如统计每10分钟内的打卡次数
SELECT
device_id,
DATE_FORMAT(
concat(
date(create_time),
' ',
HOUR (create_time),
':',
floor(MINUTE(create_time) / 10) * 10
),
'%Y-%m-%d %H:%i'
) AS createTime,
count(*) AS num
FROM
t_user_atten_record
WHERE
com_id = 1111699
GROUP BY
device_id, createTime
ORDER BY
device_id, createTime;
统计每10分钟内的打卡次数
按分钟统计
如果要按分钟进行分组,统计每分钟内的打卡次数
SELECT
device_id,
DATE_FORMAT(
create_time,
'%Y-%m-%d %H:%i:00'
) AS createTime,
count(*) AS num
FROM
t_user_atten_record
WHERE
com_id = 1111699
GROUP BY
device_id, createTime
ORDER BY
device_id, createTime;
按分钟进行分组统计:
按日期统计
按照日期进行分组,统计每天的打卡次数:
SELECT
device_id,
DATE(
create_time
) AS createTime,
count(*) AS num
FROM
t_user_atten_record
WHERE
com_id = 1111699
GROUP BY
device_id, createTime
ORDER BY
device_id, createTime;
按天分组统计