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

如何在PostgreSQL中查询滑动时间窗口内符合条件的行占比

滚动时间窗口内符合条件行的占比计算方法

要实现基于时间的滚动窗口内满足field1 > crit的行占比,核心是把你之前用的固定行数窗口(ROWS)换成时间范围窗口(RANGE),再结合条件聚合函数计算占比,具体实现如下:

核心逻辑

用CASE语句把符合条件的行标记为1,不符合的标记为0,然后对这个标记值求窗口内的平均值——平均值就是符合条件的行占总窗口行数的比例。同时把窗口范围从固定行数改成基于时间的区间。

示例代码(过去1分钟窗口)

SELECT 
  timestamp,
  -- 计算窗口内满足条件的行占比
  AVG(CASE WHEN field1 > crit THEN 1.0 ELSE 0.0 END) 
    OVER(
      ORDER BY timestamp 
      RANGE BETWEEN INTERVAL '1 minute' PRECEDING AND CURRENT ROW
    ) AS field1_crit_ratio
FROM schema."table" a;

不同时间窗口的调整

只需要修改INTERVAL的参数即可适配不同窗口:

  • 过去5小时:INTERVAL '5 hours'
  • 过去1天:INTERVAL '1 day'

为什么不用固定行数窗口?

你之前用的ROWS BETWEEN 29 PRECEDING AND CURRENT ROW是固定30行的窗口,但如果数据的时间间隔不均匀(比如某段时间数据密集、某段稀疏),这个窗口的实际时间跨度会波动,而用RANGE基于时间的窗口能严格保证是你需要的1分钟/5小时等固定时间范围,更符合需求。

内容的提问来源于stack exchange,提问作者WolfiG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:02:35