我有一个数据库表格,其中包含成千上万个论坛帖子,我想弄清哪个小时的时间段包含最多的帖子。

我可以一次向前爬行一分钟,保留一系列时间戳,并跟踪哪个小时最多,但是我觉得有更好的方法可以做到这一点。我将在一年的帖子中运行此操作,因此检查一年中的每一分钟似乎非常糟糕。

理想情况下,将有一种方法可以在单个数据库查询中执行此操作。

最佳答案

给定一个表,该表中有一年中的每一分钟,您对Minutes和带有Posts列的表Time感兴趣:

select top 1 minutes.time, count (posts.time)
from Minutes
   left join posts on posts.time >= minutes.time AND posts.time < dateadd(hour, 1, Minutes.Time)
group by minutes.time
order by count (posts.time) desc

要解决生成分钟表的问题,可以使用ufn_GenerateIntegers.之类的函数
然后函数变成
select top 5 minutes.time, count (posts.time)
from (select dateadd(minute, IntValue, '2008-01-01') as Time from ufn_GenerateIntegers(525600)) Minutes
   left join posts on posts.time >= minutes.time AND posts.time < dateadd(hour, 1, Minutes.Time)
group by minutes.time
order by count(posts.time) desc

我刚刚进行了大约5000次随机发布的测试,而在我的计算机上花费了16秒。因此,对于偶尔的一次性查询而言,这并非微不足道,但并非多余。幸运的是,这是一个数据点,您可以每天计算一次,甚至每月一次,如果要经常显示该值,则可以进行缓存。

看一看lassevk's improvement

关于database - 如何找到具有最多数据点的一小时时段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/508444/

10-13 06:37
查看更多