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

如何用SQL遍历记录并识别日期重叠的记录?

找出日期重叠的记录(SQL实现)

嘿,要找出同一Id下和前一条记录日期重叠的条目,用窗口函数LAG()就能轻松搞定,不用复杂的遍历操作。先理清楚你的需求:对每个Id,按Open_date排序后,判断当前记录的Open_date是否早于上一条记录的Closed_Date,满足条件的就是你要识别的重叠记录。

示例数据

假设你的表名为your_table,修正了无效日期后的示例数据如下:

IdOpen_dateClosed_Date
12016-01-012017-01-01
12016-12-312018-01-01
12016-01-012018-01-01
22017-01-012018-02-02

SQL查询方案

方案1:使用CTE(推荐,可读性高)

WITH ranked_records AS (
    SELECT 
        Id,
        Open_date,
        Closed_Date,
        -- 按Id分组、Open_date排序,获取前一条记录的Closed_Date
        LAG(Closed_Date) OVER (PARTITION BY Id ORDER BY Open_date) AS prev_closed_date
    FROM your_table
)
SELECT 
    Id,
    Open_date,
    Closed_Date
FROM ranked_records
-- 筛选出当前记录开始日期早于前一条结束日期的重叠记录
WHERE Open_date < prev_closed_date;

方案2:使用子查询(兼容更多SQL版本)

如果你的数据库不支持CTE,可以用子查询实现同样的逻辑:

SELECT 
    Id,
    Open_date,
    Closed_Date
FROM (
    SELECT 
        Id,
        Open_date,
        Closed_Date,
        LAG(Closed_Date) OVER (PARTITION BY Id ORDER BY Open_date) AS prev_closed_date
    FROM your_table
) AS sub_query
WHERE Open_date < prev_closed_date;

逻辑说明

  • PARTITION BY Id:按Id分组,确保只在同一个Id的记录间比较。
  • ORDER BY Open_date:对每个Id内的记录按开始日期排序,保证“前一条记录”是时间上的前序条目。
  • LAG(Closed_Date):获取当前记录的上一条记录的结束日期,用来和当前记录的开始日期做重叠判断。

针对你的示例数据,执行上述查询后会返回Id为1的第二条和第三条记录,这两条都满足与前一条记录日期重叠的条件。

内容的提问来源于stack exchange,提问作者Hari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:57