mysql每5分钟统计_SQL按时间段统计(5分钟统计⼀次访问
量为例,oracle统计)
需求:统计当天的访问量,每五分钟采集⼀次
表结构中有⽇期字段,类型TIMESTAMP
如果,统计是采⽤每秒/分钟/⼩时/天/周/⽉/年,都⾮常容易实现,只要to_char⽇期字段然后group by分组即可
但是:如果是X秒/分钟/⼩时/天/周/⽉/年 and X>1,就需要变通实现,⽅法如下:
⽅案⼀:临时表/临时存储
统计每5分钟的访问量,存⼊临时表或者临时存储(⽐如excel)
循环当天整个时间段
然后对临时表/临时存储的数据做排序
⽅案⼆:伪列的SQL查询(数据量⼩于<1亿数据量,且时间列做索引)
分析:5分钟⼀次,那就对每条记录做个伪列,每5分钟的数据都是⼀个标识。
⽐如:创建时间=201604061200-⾄- 201604061204,这五分钟统⼀标识为201604061200
创建时间=201604061205 -⾄- 201604061209,这五分钟统⼀标识为201604061205
实现起来⾮常⽅便:
a. 取出创建时间的分钟参数:to_ate_time,'mi'),都是两位:⽐如01分,07分,13分,19分....
只判断第⼆位,如果第⼆位<5,统⼀让分钟的第⼆位=0,否则(第⼆位>=5)统⼀让分钟的第⼆位=5
⽽分钟的第⼀位不变
⽐如01分、04分统⼀标识为00分,05、06、09分统⼀标识为05分
切割字符串使⽤substr函数
判断使⽤case when
拼接使⽤||
b.取出创建时间的年⽉⽇⼩时参数,拼装上第⼀步的特殊分钟参数
⼀个伪列就这么诞⽣了
关键SQL如下:
case when substr(to_ate_time,'mi'),2,1)<5 then
to_ate_time,'yyyymmddhh24')||substr(to_ate_time,'mi'),1,1)||0
else to_ate_time,'yyyymmddhh24')||substr(to_ate_time,'mi'),1,1)||5 end as newTime
上⼀个完整的sql
select count(tmp.id) wTime
from(
groupby分组select t.id,t.latest_status, -- ID,状态
to_ate_time,'yyyymmddhh24mi') oldTime, -- 原来的时间
case when substr(to_ate_time,'mi'),2,1)<5 then
to_ate_time,'yyyymmddhh24')||substr(to_ate_time,'mi'),1,1)||0
else to_ate_time,'yyyymmddhh24')||substr(to_ate_time,'mi'),1,1)||5 end as newTime -- 时间段伪列from acquire_order t
ate_time>=to_date('20160406000000','yyyymmddhh24miss')
order ate_time asc
) tmp
group wTime
order by totalNum desc

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。