У меня есть датчики, отправляющие данные каждые ~ 20 секунд. Однако иногда у них возникают проблемы, и они не выдают данные в течение минут или часов.

Я хотел бы получить эти разъединения и узнать, как долго они длятся.

Поэтому я попытался с помощью функции time_bucket подсчитать количество данных по 5-минутным сегментам (например), но эта функция влияет только на сами данные. Таким образом, невозможно получить ведро HAVING COUNT (*) = 0.

Я пробовал это:

SELECT time_bucket('5 minutes', datetime) AS bucket, COUNT(*) AS nb_datas
FROM measures
WHERE id_sensor = 123456
GROUP BY bucket
HAVING COUNT(*) = 0
ORDER BY bucket DESC;

Но по логике он ничего не возвращает.

Небольшая помощь будет оценена :)

4
Raphiki 2 Янв 2018 в 19:57

2 ответа

Лучший ответ

Вот решение, которое я нашел благодаря TimescaleDB github:

SELECT period.date
FROM (
    SELECT generate_series(date '2018-01-09 00:00:00', now(), interval '5 minutes') date
) as period
WHERE period.date NOT IN (
    SELECT
        time_bucket('5 minutes', datetime) AS date
    FROM measures
    WHERE id_sensor = '123456'
        AND datetime >= '2018-01-09 00:00:00'
    GROUP BY date
    ORDER BY date
)

Он использует функцию generate_series из PostgreSQL для заполнения сегментов, затем вычитает сегменты с данными, чтобы оставить только те, которые имеют COUNT (*) = 0.

1
Raphiki 9 Янв 2018 в 09:15

Возможно, вас заинтересует заполнение пробелов, которое описано в документации TimescaleDB по адресу: http://docs.timescale.com/using-timescaledb/reading-data#gap-filling

3
suntruth 9 Янв 2018 в 17:39