Периоды перекрытия запросов из информации об использовании, хранящейся в базе данных SQL - PullRequest
0 голосов
/ 23 октября 2010

У меня есть таблица в базе данных 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 ресурсы в запросе, которые кажутся чрезмерными, так как о них будет сообщено только очень небольшое количество комбинаций.

Заранее благодарим за любую помощь или идеи.

1 Ответ

0 голосов
/ 17 марта 2013

Для периодов использования

Используйте тип диапазона из PostgreSQL 9.2 и проверьте на совпадение для любых периодов, которые у вас есть.Вы можете взять несколько перекрывающихся сегментов, чтобы постепенно уменьшать диапазоны.

Это не совсем тривиально, поэтому, боюсь, у меня нет простого примера.

Для периодов простоя:

Я думаю, вы захотите сделать это с каким-то типом интервала (новые типы в 9.2 были бы полезны здесь) или создать аналогичный тип, который вы могли бы использовать для запросов.Обратите внимание, что там, где я это сделал, это не было тривиально.

Второе, что вы хотели бы сделать, - это создать собственный агрегат для сравнения и добавления интервалов.Это должно было бы вернуть массив этих типов.Наконец, вам нужно будет иметь возможность многократно проходить через различия.

Здесь нет простого решения.Используемый код является более сложным, чем вы, вероятно, хотели бы, и это будет больше, чем можно было бы получить из ответа здесь.Здесь задействовано значительное количество логики и дизайнерских усилий.Это вполне возможно, но не очень просто.

...