#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. Классно! С удовольствием помогу! 😊