如何将 timescaleDB 查询限制为使用的存储桶大小?
Posted
技术标签:
【中文标题】如何将 timescaleDB 查询限制为使用的存储桶大小?【英文标题】:Howto limit timescaleDB queries to the used bucket size? 【发布时间】:2021-10-30 04:47:33 【问题描述】:我有一个包含时间序列数据的 postgres timescaleDB 数据库。 表流中的数据大约每 500ms 采样一次。
我需要每 1 秒获取一次数据。 我试着用 time_bucket() 函数来做。
这是我的测试查询:
SELECT time_bucket('1 second', time) AS bucket, value AS val
FROM flows fl
WHERE
fl.time > '2021-08-31 06:14:00+00' AND
fl.time <= '2021-08-31 06:18:00+00' AND
fl.sensor_id = 2
ORDER BY fl.time ASC;
返回的数据如下:
|bucket |val |
| ---------------------- | ------------------- |
| 2021-08-31 06:14:00+00 | 9.75071040883207 |
| 2021-08-31 06:14:00+00 | 10.008532745208633 |
| 2021-08-31 06:14:01+00 | 9.953632354528265 |
| 2021-08-31 06:14:01+00 | 9.833033340905137 |
| 2021-08-31 06:14:02+00 | 9.77205680132453 |
| 2021-08-31 06:14:02+00 | 10.197350449765523 |
| ... | ... |
如您所见,一秒钟的每个桶有两行。值来自每 500 毫秒收集一次的样本。
如何确保每个存储桶只有一个值? (在我的例子中:每秒一个值)
我还尝试了对值的聚合函数 (avg),但这并没有改变结果。
【问题讨论】:
【参考方案1】:对于 time_bucket 函数,为了使分桶正常工作,您必须以某种方式聚合 value
列,并按语句提供分组。例如,这样的事情应该正确地存储时间,
SELECT time_bucket('1 second', time) AS bucket,
sum(value) AS val
FROM flows fl
WHERE
time_bucket('1 second', time) > '2021-08-31 06:14:00+00' AND
time_bucket('1 second', time) <= '2021-08-31 06:18:00+00' AND
fl.sensor_id = 2
GROUP BY bucket, sensor_id
ORDER BY bucket ASC;
希望这对你有用!
披露:我是 Timescale 团队的一员 ?
【讨论】:
感谢您的回复,米兰达。不幸的是,我得到:“错误:列“fl.time”必须出现在 GROUP BY 子句中或用于聚合函数第 9 行:ORDER BY fl.time ASC;”所以对于 GROUP BY 子句来说,'bucket' 似乎是不够的。 啊,对,您可能还想用分桶时间表示您的 where 子句参数,而不是原始时间列。 我用 where 子句(和 order by)中的 bucket 语句更新了我的示例 如果这对你不起作用,请告诉我! 太棒了!乐意效劳! ?以上是关于如何将 timescaleDB 查询限制为使用的存储桶大小?的主要内容,如果未能解决你的问题,请参考以下文章
快速入门:Java 连接使用 时序数据库 TimescaleDB
TimescaleDB VS TDengine:写入性能和查询性能是 TDengine 的 1/61/28
使用 Grafana 的(TimescaleDB)SQL 插件进行多连接的 Groupby 问题
时序数据库新手,从TimescaleDB for Grafana中选择数据速度慢,查询复杂
如何使用 JPQL、Spring Data Repositories 和 Hibernate 为 TimescaleDB `time_bucket` 函数参数化 Postgresql 间隔