在QuestDB中查询多个时间戳的紧邻小于等于记录
在QuestDB中单次查询获取多个时间戳的紧邻前序记录
针对你的需求,有两种高效的实现方式,均能通过单条查询完成:
方法1:使用LATEST ON语法(推荐)
QuestDB专为时间序列场景优化了LATEST ON语法,可快速定位到指定时间点之前的最新记录,性能远优于普通排序。直接用UNION ALL拼接每个时间戳的查询即可:
SELECT * FROM your_table LATEST ON timestamp WHERE timestamp <= '2024-05-20T00:00:00Z' UNION ALL SELECT * FROM your_table LATEST ON timestamp WHERE timestamp <= '2024-05-21T00:00:00Z' UNION ALL SELECT * FROM your_table LATEST ON timestamp WHERE timestamp <= '2024-05-22T00:00:00Z' UNION ALL SELECT * FROM your_table LATEST ON timestamp WHERE timestamp <= '2024-05-23T00:00:00Z' UNION ALL SELECT * FROM your_table LATEST ON timestamp WHERE timestamp <= '2024-05-24T00:00:00Z';
说明:
- 替换
your_table为你的实际表名,timestamp为表中存储时间的字段名 - 时间戳请使用QuestDB支持的格式(如ISO 8601:
YYYY-MM-DDTHH:MM:SSZ) LATEST ON会直接利用时间索引/分区定位记录,无需全表排序,数据量越大优势越明显- 若需严格小于目标时间戳,将
<=改为<即可
方法2:子查询+窗口函数(兼容通用SQL场景)
如果你更习惯通用SQL写法,可通过窗口函数分组筛选每个目标时间戳对应的最新记录:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY target_ts ORDER BY timestamp DESC) AS rn FROM ( -- 为每条记录匹配对应的目标时间戳 SELECT t.*, ts.target_ts FROM your_table t CROSS JOIN ( -- 列出所有需要查询的目标时间戳 SELECT '2024-05-20T00:00:00Z' AS target_ts UNION ALL SELECT '2024-05-21T00:00:00Z' UNION ALL SELECT '2024-05-22T00:00:00Z' UNION ALL SELECT '2024-05-23T00:00:00Z' UNION ALL SELECT '2024-05-24T00:00:00Z' ) ts WHERE t.timestamp <= ts.target_ts ) matched ) ranked WHERE rn = 1;
说明:
- 子查询
ts中列出所有目标时间戳 - 外层通过
ROW_NUMBER()按目标时间戳分组,取每组内时间最晚的记录(rn=1) - 该写法兼容性更强,但性能不如
LATEST ON,适合小数据集或需要兼容其他数据库的场景
内容的提问来源于stack exchange,提问作者Humble_Aspirant
相关产品推荐
相关产品推荐

