我有一个表(MySQL),每隔n秒捕获一次样本.该表有许多列,但重要的是两个:时间戳(TIMESTAMP类型)和计数(INT类型).
我想做的是在一定范围内获得计数列的总和和平均值.例如,我每2秒记录一次样本,但我希望所有样本的10秒或30秒窗口中所有样本的计数列总和.
这是一个数据示例:
+---------------------+-----------------+ | time_stamp | count | +---------------------+-----------------+ | 2010-06-15 23:35:28 | 1 | | 2010-06-15 23:35:30 | 1 | | 2010-06-15 23:35:30 | 1 | | 2010-06-15 23:35:30 | 942 | | 2010-06-15 23:35:30 | 180 | | 2010-06-15 23:35:30 | 4 | | 2010-06-15 23:35:30 | 52 | | 2010-06-15 23:35:30 | 12 | | 2010-06-15 23:35:30 | 1 | | 2010-06-15 23:35:30 | 1 | | 2010-06-15 23:35:33 | 1468 | | 2010-06-15 23:35:33 | …
假设我有以下表格:
CREATE TABLE `occurences` (
`object_id` int(10) NOT NULL,
`seen_timestamp` int(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
其中包含对象的ID(不唯一,重复)和观察此对象ID时的时间戳.
观察每周7天,每天24小时运行,并插入每个出现的对象ID和当前时间戳.
现在我想编写查询来选择在任何10分钟时间内至少看过7次的所有对象ID.
它应该像检测入侵一样起作用.
在denyhost脚本中使用类似的算法来检查无效的SSH登录.如果在配置的时间段内找到配置的出现次数,则会阻止IP.
有什么好建议吗?
我有一个表记录事件并存储他们的时间戳(作为日期时间).我需要能够将时间分解成块并获得在该间隔中发生的事件的数量.间隔可以是自定义的(比如5分钟到1小时甚至更长).
显而易见的解决方案是将datetime转换为unix_timestamp,将其除以间隔中的秒数,取其底层函数并将其乘以秒数.最后将unix_timestamp转换回日期时间格式.
这适用于小间隔.
select
from_unixtime(floor(unix_timestamp(event.timestamp)/300)*300) as start_time,
count(*) as total
from event
where timestamp>='2012-08-03 00:00:00'
group by start_time;
Run Code Online (Sandbox Code Playgroud)
这给出了正确的输出
+---------------------+-------+
| start_time | total |
+---------------------+-------+
| 2012-08-03 00:00:00 | 11 |
| 2012-08-03 00:05:00 | 4 |
| 2012-08-03 00:10:00 | 4 |
| 2012-08-03 00:15:00 | 7 |
| 2012-08-03 00:20:00 | 8 |
| 2012-08-03 00:25:00 | 1 |
| 2012-08-03 00:30:00 | 1 |
| 2012-08-03 00:35:00 | 3 | …Run Code Online (Sandbox Code Playgroud)