如何在MySQL中查找时间范围重叠的最大发生次数
查找时间范围重叠的最大次数
不用循环,用事件点累加的方法就能高效解决这个问题,核心思路是把每个时间范围拆分为"开始"和"结束"两个事件,通过排序累加计算实时重叠数,再取最大值。
实现步骤(以PostgreSQL为例)
- 拆分事件点:将每条时间记录拆成两个事件——开始时间对应计数+1,结束时间对应计数-1
- 排序并累加:按事件时间排序(注意时间相同时先处理结束事件),用窗口函数实时计算当前重叠次数
- 取最大值:从实时重叠数中提取最大值,就是你要的最大重叠次数
示例SQL代码
WITH event_points AS ( -- 拆分开始事件(+1)和结束事件(-1) SELECT start AS event_time, 1 AS delta FROM time_ranges UNION ALL SELECT end AS event_time, -1 AS delta FROM time_ranges ), sorted_events AS ( -- 按时间排序,同时累加delta得到当前重叠数 -- 排序时加delta,确保同时间的结束事件先处理(避免衔接的时间被算成重叠) SELECT event_time, delta, SUM(delta) OVER (ORDER BY event_time, delta) AS current_overlap FROM event_points ) -- 取最大重叠次数 SELECT MAX(current_overlap) AS max_overlap_count FROM sorted_events;
关键说明
- 这个方法是基于集合操作的,比循环查询效率高得多,尤其适合数据量较大的场景
- 排序时带上
delta是关键:如果两个事件时间完全相同,结束事件(delta=-1)会排在开始事件前面,这样刚好结束和开始的时间范围不会被错误统计为重叠
内容的提问来源于stack exchange,提问作者Tobia
相关产品推荐
相关产品推荐

