Timescaledb time_bucket 获取没有行的周期

Timescaledb time_bucket fetch periods with no row

我的传感器每大约 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;

但逻辑上 return 没什么。

不胜感激:)

这里是我找到的解决方案,感谢 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。

您可能对填充间隙感兴趣,TimescaleDB 文档中对此进行了描述:http://docs.timescale.com/using-timescaledb/reading-data#gap-filling