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

PostgreSQL技术问询:如何查询机场航班最繁忙的滚动1小时时段

解决滚动1小时窗口的航班繁忙时段查询问题

你的初始查询确实只能统计整点到整点的固定小时段,没法覆盖像10:20-11:20这种任意连续1小时的窗口,我给你两种实用的解决方案,适配不同的场景:

方法一:基于航班时间的窗口统计(性能优先)

这种方法利用窗口函数,针对每个航班的起飞时间,统计它前1小时到当前时间这个窗口内的航班数量,最后找出航班数最多的窗口:

WITH flight_with_window AS (
    SELECT
        takeOffTime,
        -- 统计当前航班起飞时间前1小时到此刻的所有航班数
        COUNT(*) OVER (
            ORDER BY takeOffTime
            RANGE BETWEEN INTERVAL '1 hour' PRECEDING AND CURRENT ROW
        ) AS flight_count
    FROM flight
)
SELECT
    takeOffTime - INTERVAL '1 hour' AS window_start,
    takeOffTime AS window_end,
    MAX(flight_count) AS max_flights
FROM flight_with_window
ORDER BY max_flights DESC
LIMIT 1;

优点:

  • 不需要生成额外的时间序列,性能表现出色,适合数据量较大的场景
  • 结果基于实际存在的航班时间,不会出现完全没有航班的空窗口

注意点:

  • 窗口的结束时间是某个航班的起飞时间,如果最优窗口的结束时间恰好没有航班,可能会错过,但实际业务中航班密度足够的话,这个误差可以忽略

方法二:生成全量时间窗口(精度优先)

如果你需要绝对精确的任意1小时窗口统计,可以用generate_series生成连续的时间点作为窗口起点,逐个统计每个窗口内的航班数:

WITH time_windows AS (
    SELECT
        generate_series(
            -- 从最早的航班时间开始
            (SELECT MIN(takeOffTime) FROM flight),
            -- 到最晚航班时间减1小时结束(避免窗口超出数据范围)
            (SELECT MAX(takeOffTime) FROM flight) - INTERVAL '1 hour',
            INTERVAL '1 minute' -- 步长可调整,越小精度越高,性能消耗越大
        ) AS window_start
)
SELECT
    window_start,
    window_start + INTERVAL '1 hour' AS window_end,
    COUNT(f.takeOffTime) AS flight_count
FROM time_windows w
LEFT JOIN flight f
    ON f.takeOffTime >= w.window_start
    AND f.takeOffTime < w.window_start + INTERVAL '1 hour'
GROUP BY window_start, window_end
ORDER BY flight_count DESC
LIMIT 1;

优点:

  • 完全覆盖所有可能的1小时连续窗口,结果绝对精确
  • 可以通过调整步长平衡精度和性能(比如用5分钟步长,既不会太耗资源,精度也足够)

注意点:

  • 步长越小,生成的窗口数量越多,对数据库性能消耗越大,需要根据数据量合理选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:58