Timescaledb time_bucket获取没有行的句点

时间:2018-01-02 16:57:34

标签: sql postgresql timescaledb

我的传感器每隔约20秒发射一次数据。然而,有时这些都有问题,并且几分钟或几小时内不会发出数据。

我想获取这些断开连接并知道它们持续多长时间。

所以我尝试使用函数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; 来计算5分钟的数据(例如),但此函数仅影响数据本身。因此,不可能获取桶HAVING COUNT(*)= 0。

我试过了:

{{1}}

但从逻辑上讲,它什么都不返回。

一点点帮助会很明白:)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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。