如何将 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 间隔

Oracle 查询:如何将返回的记录限制为计数 > 1 但显示完整结果的记录?