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

PostgreSQL如何按间隔生成时间戳范围并查询重叠事件

实现方案

你直接把生成时间范围的逻辑作为子查询替换原有的时间点grid,关联时使用&&重叠运算符即可,完整可运行的查询如下:

SELECT 
    row_number() OVER (ORDER BY grid.time_range) AS id,
    grid.time_range,
    count(DISTINCT t.id) AS id_count
FROM (
    SELECT tsrange((lag(bin) OVER (ORDER BY bin)), bin, '[)') AS time_range
    FROM generate_series(
        '2021-08-01 00:00:00'::timestamp,
        '2021-08-07 23:59:59'::timestamp, 
        interval '60 min'
    ) AS bin
    OFFSET 1 -- 跳过第一行lag生成的空区间,也可以在外层加WHERE time_range IS NOT NULL过滤
) grid
LEFT JOIN event t ON t.order_dates && grid.time_range
GROUP BY grid.time_range
ORDER BY grid.time_range;

说明

  • 内层子查询直接复用了你写的时间范围生成逻辑,产出每个左闭右开的60分钟时间区间
  • 关联条件替换为&&运算符,会匹配所有和当前时间区间存在重叠的事件
  • 额外优化:你之前写的generate_series后加了FROM event,会生成和event表行数一致的重复时间序列,直接去掉即可,generate_series本身可以独立生成所需的时间序列,不需要依赖物理表
  • 可以根据需求调整generate_series的起止时间和间隔,或者新增聚合字段(比如统计区间内的流量总和加sum(t.flow) AS total_flow即可)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:57:01