MySQL查找日期范围与计数

时间:2018-02-14 19:36:06

标签: mysql analytics

在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个记录。

2 个答案:

答案 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 hourselect 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;启动。