У меня есть таблица "district_sensor_data":
+----------------------------+--------------+-------+
| timestamp | district_id | value |
+----------------------------+--------------+-------+
| 2020-04-06 00:04:20.000000 | 4 | 14 |
| 2020-04-06 00:09:40.000000 | 8 | 15 |
| 2020-04-06 00:06:25.000000 | 11 | 15 |
| 2020-04-06 00:06:45.000000 | 11 | 16 |
| 2020-04-06 00:00:30.000000 | 1 | 36.4 |
| 2020-04-06 00:00:35.000000 | 1 | 39.4 |
+----------------------------+--------------+-------+
- Частота дискретизации составляет 5 секунд, и существует несколько кортежей с одной и той же временной меткой
- Тем не менее, также отсутствуют метки времени.
- Данные доходят за несколько дней.
О чем это?
- Я создаю приложение для визуализации моих данных
- Существует компонент временной шкалы, который позволяет вам выбрать 1-дневное окно данных, которое будет отображаться.
- Выбор этого временного окна осуществляется с помощью прокрутки, поэтому существует множество возможностей, «которые из всех возможных 24-часовых окон» выбраны.
- Я хочу раскрасить количество значений для district_id в текущем 24-часовом окне. Таким образом, мне нужно минимальное и максимальное количество значений для шкалы.
Вот где скользящее окно вступает в игру.
- Я хочу получить количество значений для теоретически каждого возможного 24-часового окна, сгруппированного по district_id.
- Поскольку это может занять слишком много времени, я думал не делать этого для каждого из кортежей. Итак, сначала я мог бы сгруппировать в 1-часовые корзины (также по district_id), а затем применить скользящее окно. Но я мог бы с радостью пропустить это упрощение.
Я уже изучал оконные функции Postgres, но даже не могу приблизиться к тому, к чему стремлюсь.
Моя основная проблема - это непостоянные временные ряды, из-за которых невозможно указать размер окна, используя количество строк. Есть ли способ определить окно по времени, как 24-часовое окно?
Тогда я не знаю, как бы я включил временной ряд "наземной правды", используя generate_series()
, чтобы учесть одно вычисление каждые 5 секунд.
Практически единственное, что мне удалось выполнить без ошибок, но даже близко к цели:
SELECT extract(HOURS FROM dsd.timestamp) as hour,
sensor_id,
value,
count(value) OVER (
PARTITION BY district_id, sensor_id
ORDER BY timestamp
)
FROM district_sensor_data dsd;
edit: я изменил пост для некоторых пояснений и удалил sensor_id, так как он на самом деле здесь не актуален. Извините за путаницу.