如何筛选无日期重叠的工单数据行?
问题:筛选无重叠的工单日期范围(用于判断指定日期是否有工单)
我们有一张存储产品工单日期信息的表,每行对应一个工单,包含id、start_date(开始日期)、end_date(结束日期)和product_id(产品ID)。同一产品的多个工单日期可能存在重叠,现在需要筛选出无重叠的日期范围行,以此简化后续判断指定日期是否有工单的逻辑。
初始数据
| id | start_date | end_date | product_id |
|---|---|---|---|
| 128981 | 10/8/2024 | 10/12/2024 | 756 |
| 125654 | 10/9/2024 | 10/9/2024 | 756 |
| 129034 | 10/12/2024 | 10/15/2024 | 756 |
| 127171 | 10/13/2024 | 10/13/2024 | 756 |
| 127796 | 10/15/2024 | 10/15/2024 | 756 |
期望筛选结果
| id | start_date | end_date | product_id |
|---|---|---|---|
| 128981 | 10/8/2024 | 10/12/2024 | 756 |
| 129034 | 10/12/2024 | 10/15/2024 | 756 |
解决方案SQL语句
核心思路是排除那些被其他工单日期范围完全包含的行,保留覆盖范围最广的顶层工单:
SELECT t1.* FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.product_id = t1.product_id AND t2.id != t1.id AND t2.start_date <= t1.start_date AND t2.end_date >= t1.end_date );
说明
- 替换语句中的
your_table_name为实际表名 NOT EXISTS子查询会检查同一产品下是否存在其他工单,其日期范围完全覆盖当前工单的日期区间- 若存在这样的覆盖工单,当前工单会被排除;最终保留的就是无重叠的、覆盖范围最完整的工单行
内容的提问来源于stack exchange,提问作者MyNameHere
相关产品推荐
相关产品推荐

