Запрос TimescaleDB для выбора строк, в которых значение столбца изменилось по сравнению с предыдущей строкой - PullRequest
0 голосов
/ 27 мая 2019

Совсем недавно начал использовать TimescaleDB с postgrest для обработки большинства запросов данных.

Однако я столкнулся с проблемой, когда у меня ужасно неэффективный запрос временных рядов данных.

Это ряд данных, который может быть любого отрезка времени с конкретными значениями Integer.

В большинстве случаев значение будет одинаковым, если только не будет аномалии.Таким образом, вместо получения + 10000 строк данных.Я хотел бы объединить это в «блоки времени».

Допустим, в строке 97 элементов, где значение равно 100 (новый элемент каждые 5 минут) # 98 значение равно 48 для 5 элементов вrow, а затем возвращается до 100 для еще 2 900 строк.

Я не хочу получать 3002 элемента для отображения этих данных.Мне нужно только выбрать 3 элемента.

  • 1 элемент, который говорит, что значение равно 100 из startDate
  • 1 элемент, который говорит, что значение равно 48 из startDate после # 1
  • 1 элемент, который говорит, что значение снова равно 100 из startDate после # 2

Но у меня возникли некоторые затруднения с выяснением, как я могу сделать это с timescaledb.

в основном, если значение совпадает с последним значением, агрегируйте его.Это все, что мне нужно для этого.

Кто-нибудь знает, как построить VIEW для такого рода ситуации в timescaleDB, используя непрерывное агрегирование (или, если есть более быстрый способ), чтобы извлечь это?

1 Ответ

2 голосов
/ 28 мая 2019

Вы можете достичь желаемого результата с помощью оконных функций и подвыбора:

SELECT time, value FROM (
  SELECT 
    time,
    value,
    value - LAG(value) OVER (ORDER BY time) as diff
  FROM hypertable) ht 
WHERE diff IS NULL OR diff != 0;

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

...