Postgres: подсчет числа движущихся кортежей в час, пропущенные значения - PullRequest
0 голосов
/ 07 июля 2019

У меня есть таблица "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, так как он на самом деле здесь не актуален. Извините за путаницу.

...