繁体   English   中英

MySQL找到带有计数的日期范围

[英]MySQL find date range with count

在MySQL中,很容易找到某个时间间隔内存在的记录数。

SELECT COUNT(*) FROM records WHERE create_date > '2018-01-01 01:15:00' AND create_date < '2018-01-01 02:15:00'

但是我想做相反的事情。 我不想提供时间间隔并获取记录计数,而是要提供记录计数并检查是否存在X分钟的时间间隔,其中创建的记录多于Y。 只有存在或不存在时,获取精确的时间间隔不是必需的。 在更高的级别上,我试图确定一天中创建的记录超过Y个记录时,是否存在X分钟的“波动”。

例如,在过去的24小时中,是否有1个小时的间隔发生了50多个新记录的“激增”?

我已经排除了将24小时划分为1小时间隔的块并检查每个块的可能性。 这不起作用,因为“喘振”可能跨越两个连续的1小时块,例如01:00:00块结束时有25条记录,而02:00:00块开始处有25条记录。

应该这样做:

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

这是计算在每条记录之后或之前X秒钟内创建的Y记录多于Y记录的数量。

所以基本上,如果有的话,它将返回> = 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 grouping by 这是为了防止在同一小时内多次启动“电涌”:

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;

但是,这样做的问题是某些电涌可能会持续超过1个小时,但是应该让您立即开始“电涌”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM