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

如何移除与上一行时间重叠的记录?尝试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;

逻辑说明

  1. PARTITION BY date:按日期分组,确保只对比同一天内的时间记录
  2. ORDER BY start_date:按开始时间排序,保证LAG取到的是时间顺序的上一条记录
  3. 过滤条件:
    • 第一条记录没有上一条,直接保留
    • 其他记录仅当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:18:14