Как сгенерировать сгруппированные по минутам в заданный день, max min и avg для временного диапазона в postgresql?

#postgresql #time #database-performance #postgres-9.6

#postgresql #время #база данных-производительность #postgres-9.6

Вопрос:

Здравствуйте, я пытался сгенерировать отчет на основе некоторых данных БД. Мне нужно рассчитать за ДЕНЬ (завершено), поэтому в этом случае допустим, что день для вычисления будет: (2001-01-02), а на текущую дату мы находимся в 2001-01-03. Итак, в основном за день до текущей даты.

  • МАКСИМАЛЬНОЕ количество заполняемости locker_orders в этот день время возникновения (пиковая максимальная загрузка шкафчиков на место)
  • Минимальное количество мест для размещения locker_orders в этот день время возникновения (пиковая минимальная загрузка шкафчиков на место)
  • Среднее значение для заполнения locker_orders в этот день (средняя загрузка в этот день на основе min max и количества шкафчиков на место)
  • группа ПО place_id
  • группа ЗА каждую минуту в текущий день
  • КОЛИЧЕСТВО всех шкафчиков в хранилище на этот день (может меняться со временем)
  • Там, где нет даты получения, шкафчик все еще занят — он может переместиться на другой интервал дней

Я смог выполнить простой запрос для группировки по месту и по минутам, в которые был создан заказ шкафчика, но в настоящее время у меня проблема с размещением его в области текущего дня

вот представление временной шкалы (ручная работа ;))

временная шкала

Дана схема данных, содержащая

ДАННЫЕ БД

  • ШКАФЧИКИ
 ------------------------------------
| id |        created_at           |
------------------------------------
|  1 | 2001-01-01 00:00 (DATETIME) |
------------------------------------
|  2 | 2001-01-01 00:00 (DATETIME) |
------------------------------------
|  3 | 2001-01-01 00:00 (DATETIME) |
------------------------------------
|  4 | 2001-01-01 00:00 (DATETIME) |
------------------------------------
|  5 | 2001-01-01 00:00 (DATETIME) |
------------------------------------
 
  • LOCKER_ORDERS
 ------------------------------------------------------------------------------------
| id |          created_at         |        pickup_date     | place_id |  locker_id |
------------------------------------------------------------------------------------
|  1 | 2001-01-02 10:00 (DATETIME) |  2001-01-02 13:25 (DATETIME) |  1  |     2     |
------------------------------------------------------------------------------------
|  2 | 2001-01-02 07:45 (DATETIME) |  2001-01-02 11:50 (DATETIME) |  1  |     1     |
------------------------------------------------------------------------------------
|  3 | 2001-01-02 19:30 (DATETIME) |            NULL              |  1  |     4     |
------------------------------------------------------------------------------------
|  4 | 2001-01-01 14:40 (DATETIME) |  2001-01-01 21:15 (DATETIME) |  1  |     5     |
-------------------------------------------------------------------------------------
|  5 | 2001-01-02 12:25 (DATETIME) |            NULL              |  1  |     3     |
-------------------------------------------------------------------------------------
|  6 | 2001-01-02 13:30 (DATETIME) |  2001-01-02 18:40 (DATETIME) |  1  |     2     |
-------------------------------------------------------------------------------------
|  7 | 2001-01-02 12:45 (DATETIME) |  2001-01-02 20:50 (DATETIME) |  1  |     1     |
-------------------------------------------------------------------------------------
|  8 | 2001-01-02 07:40 (DATETIME) |  2001-01-02 18:15 (DATETIME) |  1  |     5     |
-------------------------------------------------------------------------------------
 

ВЫХОДНЫЕ ДАННЫЕ — желаемый результат

 # | Date (day) | place_id | min | max | avg | NO of all lockers in that day in given place |
---------------------------------------------------------------------------------------------
# | 2001-01-02 |   1      |  0  |  4  |  2  |      8      |
 

Комментарии:

1. Является ли день всего 24 часа от created_at времени или конкретной датой? Я немного смущен locker_orders наличием более одной даты в отношении вашего вопроса. Можете ли вы уточнить для меня завершенный / прошедший день? Кроме того, в одном из ваших маркеров указано «группа в минуту», но ваш желаемый результат не требует времени.

2. Столбцы min и max являются причиной поминутных вычислений? Итак, вы можете сказать, что в любую минуту это было min / max?

3. Да, именно это и является причиной минут 🙂

4. Также любой заказ шкафчика может находиться в шкафчике со дня до следующего дня или даже дальше. Поэтому я не уверен в столбце created at в контексте времени. Это почти похоже на то, что данный день находится не в столбце, а как отдельный объект, не являющийся временной областью для вычисления.

5. Для этого вам понадобится функция с какими-то ограничениями (start_time, end_time). Я немного подумал об этом. Непростая проблема для решения, но я постараюсь что-нибудь придумать.