Timescaledb:获取范围前后的第一个值

标签 timescaledb

给定时间序列范围,其值 v0-v5 以不规则间隔存储在 timescaledb 中。

v0     v1    v2   v3   v4 
t0 - t1 - t2 - t3 - t4 - t5

选择了从 >=t2 到 <=t4 的范围,从而得到 v2 和 v3。

select time from table where time >= t2 and time <=t4 order by ASC

此外,我想获得范围之后的第一个和范围之前的第一个,因此 v1 和 v4。这些值不均匀,所以我不知道 t1 或 t4 是什么时候。可以是毫秒或年。

未测试,但我想我可以按照 TimescaleDB: efficiently select last row 中的说明执行此操作吗?

第一版

select time from table where time < t2 order by desc LIMIT 1

第四版

select time from table where time > t4 order by asc LIMIT 1

但这需要进行三个查询,是否有办法使其在 timescaledb 中更高效?

最佳答案

您可以使用子查询来实现此目的:(范围为 '2021-04-01 04:04:00' - '2021-04-01 04:07 的示例查询: 00')

SELECT time FROM table
WHERE 
    (time >= timestamp '2021-04-01 04:04:00' AND time <= timestamp '2021-04-01 04:07:00')
    OR time = (SELECT time FROM table WHERE time < timestamp '2021-04-01 04:04:00' ORDER BY time DESC LIMIT 1)
    OR time = (SELECT time FROM table WHERE time > timestamp '2021-04-01 04:07:00' ORDER BY time ASC LIMIT 1)
ORDER BY time

关于Timescaledb:获取范围前后的第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69130614/

相关文章:

laravel - Laravel 的 eloquent 查询和相同的关联 SQL 查询(使用 toSql() 方法获得)之间的不同结果

sql - 无数据的物化 View 仍在加载数据

sql - 如何使用时间刻度 time_bucket_gapfill() 设置最大范围条件,以便不填充真正的缺失值?

database - 创建连续聚合时,Azure Postgres 上的 TimescaleDB 出现错误

postgresql - 如何调用 TimescaleDB 中的过程?

sql - TimescaleDB:有效地选择最后一行

sql - 按 T​​imescaleDB/PostgreSQL 中的突发事件分组

java - Hibernate 不批量插入

timescaledb - 使用 time_bucket 并在 timescaledb 中连接多个表

java - jooq 可以识别例程的可选参数并相应地创建重载吗?