我有一个响应表,它有一个时间戳字段(created_at),一个id和一个外键(context_id)
对于给定的上下文,我想看看在5分钟的间隔内发生了多少响应。
这与以下问题非常相似:
Sql Server: Count records (including zero) per ten-minute intervals
除了我没有使用SQL Server,我使用MySQL,但希望看到更通用的解决方案。
将有5分钟的间隔,其中有0个响应,我希望将其包括在结果中。
答案 0 :(得分:4)
如果你从一个“桶”表开始
bucket_start bucket_end
--
2011-01-01 00:00:00 2011-01-01 00:05:00
2011-01-01 00:05:00 2011-01-01 00:10:00
2011-01-01 00:10:00 2011-01-01 00:15:00
2011-01-01 00:15:00 2011-01-01 00:20:00
然后您可以使用外部联接来获取缺失的零。
select bucket_start, bucket_end, count(context_id)
from buckets b
left join responses r
on (r.response_time >= b.bucket_start and
r.response_time < b.bucket_end)
group by b.bucket_start, b.bucket_end
有很多方法可以生成存储桶的表(或视图)。但最通用的解决方案必须避免使用自动系列生成器(如PostgreSQL的generate_series())和公用表表达式,因为MySQL不支持它们。 (尽管您可以编写自己的函数来模仿generate_series()。)
所以最通用的解决方案只是一个基表。您也可能从基表中获得最佳性能,因为您可以索引列。
对于像这样的桌子,你每个日历年看一下大约105,000行。