写点什么

时间分布统计小技巧:任务执行耗时一目了然

作者:LLLibra146
  • 2025-01-23
    北京
  • 本文字数:660 字

    阅读完需:约 2 分钟

引言

今天接到一个统计任务,要对一个流水表中的数据按照时间进行分级统计,分享一下实现方法。

分级统计

流水表中有一个字段是任务的执行时间,就是一个任务执行了多长时间。


举个例子:



有这么一个表,想要根据时间对数据进行统计,统计结果为:任务执行耗时 0-5 秒的有多少,执行耗时 5-10 秒的有多少个,依此类推。


要如何统计呢,来看 SQL:


select name, t, count(t) as cntfrom (select tt.name, (TRUNCATE(tt.t / 5, 0) * 5) as t      from test as tt order by t) as agroup by name, t
复制代码


来看执行结果:



查看原始数据,人工校验一下,没有问题,统计结果是对的。

分级原理

既然已经有了答案了,那么这个 SQL 的原理是什么呢?


我们来分析一下,既然要将数据进行分级,那么我们首先要确定的就是要按照数字几的倍数来分级,这里我们选择 5,也就是说数据的范围就是 0-5,5-10,10-15 等等依此类推。


定好数据范围后,核心计算逻辑其实就是 TRUNCATE 函数,它的作用是丢掉小数位,例如我用 18 除以 5 以后,正常来说得到的是一个浮点型,例如 3.6,那这个时候我们将它去掉小数位后重新乘以 5,结果就只能是 5 的倍数了,结果是 15,这个时候我们就可以得到结果,18 是属于 15-20 这个区间的,18 这个数据就会落入 15-20 这个区间内。


其实,说白了,我们上面的操作就是强制让浮点数丢失精度,丢失的精度部分顶多就是 0-1,也就是说顶多会丢掉 5,最少会丢掉 0,这个方法可以让任何一个数字变成一个比自己小的 5 的倍数的一个数字,方便外层的 SQL 进行 group by 统计。


本文章首发于个人博客 LLLibra146's blog

更多文章请关注:

发布于: 刚刚阅读数: 5
用户头像

LLLibra146

关注

还未添加个人签名 2018-09-17 加入

还未添加个人简介

评论

发布
暂无评论
时间分布统计小技巧:任务执行耗时一目了然_MySQL InnoDB_LLLibra146_InfoQ写作社区