在MySQL中,很容易找到某个时间间隔内存在的记录数。
SELECT COUNT(*) FROM records WHERE create_date > '2018-01-01 01:15:00' AND create_date < '2018-01-01 02:15:00'
但我想做相反的事情。我想提供一个记录计数,并检查是否存在超过Y个记录的X分钟时间间隔,而不是提供时间间隔并获取记录数。获取确切的时间间隔不是必需的,只有存在与否。在更高的层次上,我试图确定在一天中创建的Y记录超过Y记录时是否有任何X分钟“激增”。
例如,在过去的24小时内,是否有1小时的间隔发生超过50条新纪录的“激增”?
我已经排除了将24小时分成1小时间隔的块并检查每个块。这不起作用,因为“浪涌”可能跨越两个连续的1小时块,例如01:00:00块结束时的25个记录和02:00:00块开始时的25个记录。
答案 0 :(得分:0)
这应该这样做:
SELECT COUNT(*)
FROM records r1
WHERE
(SELECT COUNT(*) FROM records r2
WHERE ABS(UNIX_TIMESTAMP(r1.create_date) - UNIX_TIMESTAMP(r2.create_date)) < X) > Y
这样做可以计算在每条记录之后或之前Y
秒内创建的记录数超过X
的记录数。
所以基本上它会返回&gt; = 1如果有的话,如果没有,则返回0。
答案 1 :(得分:0)
因此,如果您想按小时排序,则需要对记录进行分组。在这里,我使用了返回时间戳部分的内置函数year()
,month()
,dayofmonth()
,hour()
。由于您无法在where
子句中使用聚合函数,因此我必须使用having
来限制计数要求。
select date(create_date),
hour(create_date),
count(*) as surge from records
where create_date > curdate() - interval 1 day
group by year(create_date), month(create_date),
dayofmonth(create_date), hour(create_date)
having count(*) > 50;
实现目标的另一种方法可能是select
count
条记录和group by
相关区间。在这种情况下,我要向create_date
添加一小时,以获得1小时的建议间隔。只要count
大于50,它就会返回一行。请注意,我grouping by
hour
。select create_date,count(*) as surge from records
group by year(create_date), month(create_date),
dayofmonth(create_date),hour(create_date),
(create_date + interval 1 hour - create_date) having count(*) > 50;
。这是为了防止&#34;浪涌&#34;在同一时间内:
exec -a
然而,问题在于,一些浪涌可能会持续超过1小时,但它应该会给你“浪潮”#34;启动。