У меня есть таблица в базе данных PostgreSQL, которая отслеживает использование различных ресурсов. (Упрощенная) схема таблицы состоит в том, что каждая строка имеет ResourceID, StartTime Timestamp и EndTime Timestamp. Каждая строка в таблице представляет временной интервал, в котором ресурс использовался, поэтому таблица может выглядеть следующим образом: (Обратите внимание, временные метки также включают даты, которые для ясности удалены ниже)
ResourceID StartTime EndTime
---------------------------------------
1 12:30:00 12:45:00
1 12:48:25 12:50:22
2 12:32:50 12:33:44
База данных будет отслеживать тысячи различных ресурсов и несколько миллионов строк в таблице. Недавно я получил запрос на добавление функции для нового отчета, в котором указываются периоды времени, в которых все группы ресурсов используются, поэтому запрос может быть «Между 12:00 и 15:00, отобразить все периоды времени, когда ресурсы 1 2,5,8 и 12 были в использовании ". Кроме того, у запроса должен быть период «Минимальное время простоя», для которого ресурс должен быть простаивающим, прежде чем его считают свободным (пример: если Минимальное время простоя составляет 2 секунды, ресурс используется 12: 00: 00-12: 01 : 00 и 12:01:01 до 12:02:00 не будет считаться бездействующим, хотя технически он не использовался в течение 1 секунды).
Результатом запроса будет список времени начала / окончания всех времен, когда использовались все запрашиваемые ресурсы. С этого момента мне нужно вычислить некоторую статистику по этому набору данных, что не будет для меня проблемой, но я не знаю, как эффективно создать этот набор данных из исходной таблицы. При необходимости я могу записать дополнительную информацию в базу данных во время вставки, и если бы не требование произвольного подмножества ресурсов, я мог бы тогда просто создать таблицу всех простоев, но с 1000 различными ресурсами и любой возможной комбинацией 1-1000 ресурсы в запросе, которые кажутся чрезмерными, так как о них будет сообщено только очень небольшое количество комбинаций.
Заранее благодарим за любую помощь или идеи.