仅使用entranceTime、exitTime字段通过SQL查询系统同时访问连接峰值
同时连接峰值查询解决方案
原查询错误原因
你的原有查询逻辑存在根本性偏差:它统计的是开始时间落在当前记录访问时间区间内的所有访问记录数,并非同一时间点同时处于活跃状态的连接数。示例中第一条记录的访问区间覆盖了所有5条记录的entranceTime,因此会返回错误的结果5。
纯SQL实现方案
仅用entranceTime和exitTime两个字段完全可以实现需求,核心采用「时间事件扫描法」实现:
- 将每条访问记录拆分为两个事件:进入事件(时间为
entranceTime,连接数+1)、离开事件(时间为exitTime,连接数-1) - 所有事件按时间顺序排序,依次累加连接数
- 累加过程中的最大值即为同时连接访问峰值
对应兼容PostgreSQL、MySQL 8+等支持CTE和窗口函数的数据库的SQL语句如下:
WITH event_points AS ( -- 拼接所有进入、离开事件 SELECT entranceTime AS event_time, 1 AS delta FROM public.access UNION ALL SELECT exitTime AS event_time, -1 AS delta FROM public.access ), running_concurrent AS ( -- 按时间排序计算实时连接数,delta优先排序保证同时间点先算离开再算进入,避免峰值虚高 SELECT SUM(delta) OVER (ORDER BY event_time, delta) AS concurrent_count FROM event_points ) -- 取最大值即为峰值 SELECT MAX(concurrent_count) AS peak_concurrent_access FROM running_concurrent;
示例数据验证
针对你给出的示例数据,按上述逻辑计算的累计连接数变化依次为1→2→3→2→3→2→3→2→1→0,最大值为3,和实际正确峰值完全匹配。
内容的提问来源于stack exchange,提问作者Matheus Hatje
相关产品推荐
相关产品推荐

