如何用SQL遍历记录并识别日期重叠的记录?
找出日期重叠的记录(SQL实现)
嘿,要找出同一Id下和前一条记录日期重叠的条目,用窗口函数LAG()就能轻松搞定,不用复杂的遍历操作。先理清楚你的需求:对每个Id,按Open_date排序后,判断当前记录的Open_date是否早于上一条记录的Closed_Date,满足条件的就是你要识别的重叠记录。
示例数据
假设你的表名为your_table,修正了无效日期后的示例数据如下:
| Id | Open_date | Closed_Date |
|---|---|---|
| 1 | 2016-01-01 | 2017-01-01 |
| 1 | 2016-12-31 | 2018-01-01 |
| 1 | 2016-01-01 | 2018-01-01 |
| 2 | 2017-01-01 | 2018-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
相关产品推荐
相关产品推荐

