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

如何在MySQL中查找时间范围重叠的最大发生次数

查找时间范围重叠的最大次数

不用循环,用事件点累加的方法就能高效解决这个问题,核心思路是把每个时间范围拆分为"开始"和"结束"两个事件,通过排序累加计算实时重叠数,再取最大值。

实现步骤(以PostgreSQL为例)

  1. 拆分事件点:将每条时间记录拆成两个事件——开始时间对应计数+1,结束时间对应计数-1
  2. 排序并累加:按事件时间排序(注意时间相同时先处理结束事件),用窗口函数实时计算当前重叠次数
  3. 取最大值:从实时重叠数中提取最大值,就是你要的最大重叠次数

示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:49