如何移除与上一行时间重叠的记录?尝试LEAD函数未成功
移除时间重叠记录的SQL解决方案
需求:过滤掉当前记录的start_date落在上一条记录的start_date与end_date区间内的行,例如示例表中第5行(2025-06-11 13:30:00的start_date)因落在第4行的[13:00,14:00]区间内,需被剔除。
你之前用LEAD函数的思路不对——LEAD是获取下一条记录的值,而我们需要对比上一条记录的结束时间,应该用LAG函数,同时必须保证数据按日期和开始时间正确排序,才能确保"上一条"是时间顺序的前一条记录。
实现代码
假设你的表名为time_records,可以用CTE先计算上一条记录的结束时间,再过滤:
WITH ranked_records AS ( SELECT start_date, end_date, date, -- 按日期分组,取上一条记录的end_date LAG(end_date) OVER (PARTITION BY date ORDER BY start_date) AS prev_end_date FROM time_records ) SELECT start_date, end_date, date FROM ranked_records -- 保留第一条记录,或start_date不早于上一条end_date的记录 WHERE prev_end_date IS NULL OR start_date >= prev_end_date;
逻辑说明
PARTITION BY date:按日期分组,确保只对比同一天内的时间记录ORDER BY start_date:按开始时间排序,保证LAG取到的是时间顺序的上一条记录- 过滤条件:
- 第一条记录没有上一条,直接保留
- 其他记录仅当
start_date不早于上一条的end_date时保留,自动排除重叠的行
自定义调整
如果你的场景中需要严格排除start_date等于上一条end_date的情况(示例中第2行与第1行是连续,不属于重叠,默认保留),可以将过滤条件改为:
WHERE prev_end_date IS NULL OR start_date > prev_end_date;
内容的提问来源于stack exchange,提问作者Lohith
相关产品推荐
相关产品推荐

