4

我有传感器每 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

2 回答 2

3

您可能对填空感兴趣,这在 TimescaleDB 文档中有所描述:http ://docs.timescale.com/using-timescaledb/reading-data#g​​ap-filling

于 2018-01-09T17:39:01.687 回答
1

感谢 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
)

它使用 PostgreSQL 中的 generate_series 函数来填充存储桶,然后用数据减去存储桶以仅留下 HAVING COUNT(*) = 0。

于 2018-01-09T09:15:05.813 回答