我有一个包含数十万个论坛帖子的数据库表,我想知道什么时间段包含最多的帖子.
我可以一次向前爬一分钟,保留一系列时间戳并跟踪其中最多的小时数,但我觉得有更好的方法可以做到这一点.我将在一年的帖子上运行此操作,因此检查一年中的每一分钟似乎非常糟糕.
理想情况下,有一种方法可以在单个数据库查询中执行此操作.
给出一个表格,其中包含您感兴趣的年份中的每一分钟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的改进.