#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). Я немного подумал об этом. Непростая проблема для решения, но я постараюсь что-нибудь придумать.