У меня есть датчики, отправляющие данные каждые ~ 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;
Но по логике он ничего не возвращает.
Небольшая помощь будет оценена :)
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.
Возможно, вас заинтересует заполнение пробелов, которое описано в документации TimescaleDB по адресу: http://docs.timescale.com/using-timescaledb/reading-data#gap-filling
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.