Как ограничить запросы TimescaleDB используемым размером корзины?

#sql #postgresql #timescaledb

Вопрос:

У меня есть база данных postgres TimescaleDB с данными временных рядов. Данные в потоках таблиц отбирались примерно каждые 500 мс.

Мне нужно получать данные за каждую 1 секунду. Я попытался сделать это с помощью функции time_bucket ().

Это был мой тестовый запрос:

     SELECT time_bucket('1 second', time) AS bucket, value AS val 
    FROM flows fl 
    WHERE
        fl.time > '2021-08-31 06:14:00 00' AND 
        fl.time <= '2021-08-31 06:18:00 00' AND 
        fl.sensor_id = 2 
    ORDER BY fl.time ASC;
 

Возвращаемые данные выглядят следующим образом:

 |bucket                  |val                  |
| ---------------------- | ------------------- |
| 2021-08-31 06:14:00 00 | 9.75071040883207    |
| 2021-08-31 06:14:00 00 | 10.008532745208633  |
| 2021-08-31 06:14:01 00 | 9.953632354528265   |
| 2021-08-31 06:14:01 00 | 9.833033340905137   |
| 2021-08-31 06:14:02 00 | 9.77205680132453    |
| 2021-08-31 06:14:02 00 | 10.197350449765523  |
| ...                    | ...                 |
 

Как вы можете видеть, есть два ряда для каждого ведра по одной секунде. Значения получены из образцов, которые были собраны каждые 500 мс.

Как убедиться, что в каждом ведре есть только одно значение? (В моем случае: одно значение каждую секунду)

Я также попробовал функцию агрегирования (avg) по значению, но это не изменило результат.

Ответ №1:

Для функций time_bucket, чтобы корректно настроить заполнение, вам придется value каким-то образом агрегировать столбец и указать группу по статусу. Например, что-то вроде этого должно правильно распределять время,

     SELECT time_bucket('1 second', time) AS bucket, 
    sum(value) AS val 
    FROM flows fl 
    WHERE
        time_bucket('1 second', time) > '2021-08-31 06:14:00 00' AND 
        time_bucket('1 second', time) <= '2021-08-31 06:18:00 00' AND 
        fl.sensor_id = 2 
    GROUP BY bucket, sensor_id
    ORDER BY bucket ASC;
 

Надеюсь, это сработает для вас!

раскрытие информации: Я являюсь частью команды Timescale 😊

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

1. Спасибо, что ответила, Миранда. К сожалению, я получаю : «ОШИБКА: столбец «fl.время» должен отображаться в предложении GROUP BY или использоваться в СТРОКЕ агрегатной функции 9: ПОРЯДОК ПО fl.времени ASC;» Поэтому «ведро» кажется недостаточным для предложения GROUP BY.

2. Ах, верно, вы, скорее всего, захотите также представить свои аргументы предложения where с фиксированным временем, а не с исходным столбцом времени.

3. Я обновил свой пример с помощью операторов bucket в предложении where (и в порядке)

4. Дайте мне знать, если это не сработает для вас!

5. Классно! С удовольствием помогу! 😊