1.题目基本信息
1.1.题目描述
表: HallEvents
±------------±-----+
| Column Name | Type |
±------------±-----+
| hall_id | int |
| start_day | date |
| end_day | date |
±------------±-----+
该表可能包含重复字段。
该表的每一行表示活动的开始日期和结束日期,以及活动举行的大厅。
编写解决方案,合并在 同一个大厅举行 的所有重叠活动。如果两个活动 至少有一天 相同,那么它们就是重叠的。
以任意顺序返回结果表。
1.2.题目地址
https://leetcode.cn/problems/merge-overlapping-events-in-the-same-hall/description/
2.解题方法
2.1.解题思路
临时变量+分组
2.2.解题步骤
第一步,使用临时变量@g表示上一行的分组(hall_id相同同时有重叠时间事件为同一分组),@e表示当前hall的最大结束时间,@h表示上一行的hall_id;然后遍历过程中更新三个临时变量
第二步,通过分组g进行分组获取重叠事件的整合
3.解题代码
sql代码
# Write your MySQL query statement below
# 第一步,使用临时变量@g表示上一行的分组(hall_id相同同时有重叠时间事件为同一分组),@e表示当前hall的最大结束时间,@h表示上一行的hall_id;然后遍历过程中更新三个临时变量
WITH T AS (
SELECT
*,
@g := IF(@h = hall_id AND @e >= start_day, @g, @g + 1) AS g,
@e := IF(@h = hall_id AND @e >= end_day, @e, end_day) AS e,
@h := hall_id AS h
FROM
(SELECT * FROM HallEvents ORDER BY hall_id, start_day, end_day) AS t1,
(SELECT @g:=0, @e = NULL, @h = NULL) AS init
)
# 第二步,通过分组g进行分组获取重叠事件的整合
SELECT
hall_id,
MIN(start_day) AS start_day,
MAX(end_day) AS end_day
FROM T
GROUP BY g