Отличный вопрос!
Вот запрос, который я думаю даст вам, что вы хотите, без использования отдельной таблицы. Обратите внимание, что это не проверено (поэтому, вероятно, содержит ошибки), и я предположил, что datetime - это столбец типа int с # секундами, чтобы избежать тонны strftime.
select sum(concurrent_period) from (
select min(end_table.datetime - begin_table.begin_time) as concurrent_period
from (
select g1.datetime, g1.num_end, count(*) as concurrent
from (
select datetime, count(*) as num_end
from games group by datetime
) g1, games g2
where g2.datetime >= g1.datetime and
g2.datetime-g2.duration < g1.datetime and
g1.datetime >= strftime('%s','now') - 24*60*60 and
g1.datetime <= strftime('%s','now')+0
) end_table, (
select g3.begin_time, g1.num_begin, count(*) as concurrent
from (
select datetime-duration as begin_time,
count(*) as num_begin
from games group by datetime-duration
) g3, games g4
where g4.datetime >= g3.begin_time and
g4.datetime-g4.duration < g3.begin_time and
g3.begin_time >= strftime('%s','now') - 24*60*60 and
g3.begin_time >= strftime('%s','now')+0
) begin_table
where end_table.datetime > begin_table.begin_time
and begin_table.concurrent < 5
and begin_table.concurrent+begin_table.num_begin >= 5
and end_table.concurrent >= 5
and end_table.concurrent-end_table.num_end < 5
group by begin_table.begin_time
) aah
Основная идея состоит в том, чтобы составить две таблицы: одну с # одновременными играми в начале каждой игры и одну с # одновременными играми в конце. Затем соедините таблицы вместе и собирайте строки только в «критических точках», где количество одновременных игр пересекается с 5. Для каждого критического времени начала принимайте критическое время окончания, которое произошло раньше, и которое, как мы надеемся, дает все периоды, когда по крайней мере 5 игр выполнялись одновременно.
Надеюсь, это не слишком запутанно, чтобы быть полезным!