Если начать с таблицы «ведер»
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
Существует много способов создания таблицы (или представления) сегментов. Но самое общее решение состоит в том, чтобы избегать автоматических генераторов рядов (таких как generate_series () PostgreSQL) и общих табличных выражений, потому что MySQL их не поддерживает. (Хотя вы можете написать свою собственную функцию для имитации generate_series ().)
Итак, самое общее решение - это просто базовая таблица. Вы также, вероятно, получите лучшую производительность из базовой таблицы, поскольку можете индексировать столбцы.
Вы видите примерно 105 000 строк в календарном году для такой таблицы.