You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:13:18