如何在SQL中合并存在日期重叠的记录?
如何在SQL中合并存在日期重叠的记录?
现有数据
| Name | Start date | End Date |
|---|---|---|
| Bob | 1-mar-2023 | 5-may-2023 |
| Bob | 1-may-2023 | 25-may-2023 |
需求
合并同一用户下日期存在重叠或连续的记录,生成覆盖完整时间范围的单条记录。
解决方案
可以借助窗口函数实现分组聚合,以下是通用的SQL写法(适用于PostgreSQL、MySQL 8.0+、SQL Server等支持窗口函数的数据库):
WITH ranked_data AS ( SELECT Name, "Start date" AS start_date, "End Date" AS end_date, -- 标记分组:当前记录的开始日期不晚于上一条的结束日期则归为同一组 SUM(CASE WHEN LAG("End Date") OVER (PARTITION BY Name ORDER BY "Start date") >= "Start date" THEN 0 ELSE 1 END) OVER (PARTITION BY Name ORDER BY "Start date") AS group_id FROM your_table ) SELECT Name, MIN(start_date) AS "start date", MAX(end_date) AS "end date" FROM ranked_data GROUP BY Name, group_id ORDER BY Name, "start date";
逻辑说明
- 按
Name分组、Start date排序,用LAG函数获取同一用户上一条记录的结束日期。 - 通过判断当前记录的开始日期是否小于等于上一条的结束日期,确定是否属于同一连续/重叠时间区间,并用
SUM累计生成分组ID。 - 按
Name和分组ID聚合,取每组的最小开始日期和最大结束日期,得到合并后的结果。
期望输出
| Name | start date | end date |
|---|---|---|
| Bob | 1-mar-2023 | 25-may-2023 |
内容的提问来源于stack exchange,提问作者Salva
相关产品推荐
相关产品推荐

