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