基于日期区间关联两张表的SQL查询(禁用RANK/ROW_NUMBER)
日期区间关联SQL查询实现
现有两张包含日期区间的表 Table A 和 Table B,表结构及数据如下:
Table A
| ID | 开始日期 | 结束日期 |
|---|---|---|
| 1 | 01/01/2024 | 10/01/2024 |
| 1 | 10/01/2024 | 15/01/2024 |
| 1 | 15/01/2024 | 20/01/2024 |
| 2 | 01/01/2024 | 10/01/2024 |
| 2 | 10/01/2024 | 20/01/2024 |
Table B
| ID | 开始日期 | 结束日期 |
|---|---|---|
| 1 | 10/01/2024 | 11/01/2024 |
| 1 | 12/01/2024 | 18/01/2024 |
| 2 | 10/01/2024 | 10/01/2024 |
需要生成如下指定输出结果:
目标输出
| ID | 表A开始日期 | 表A结束日期 | 表B开始日期 | 表B结束日期 |
|---|---|---|---|---|
| 1 | 01/01/2024 | 10/01/2024 | NULL | NULL |
| 1 | 10/01/2024 | 15/01/2024 | 10/01/2024 | 11/01/2024 |
| 1 | 10/01/2024 | 15/01/2024 | 12/01/2024 | 18/01/2024 |
| 1 | 15/01/2024 | 20/01/2024 | NULL | NULL |
| 2 | 10/01/2024 | 20/01/2024 | 10/01/2024 | 10/01/2024 |
实现SQL语句
要求查询带有WHERE条件,且不能使用RANK或ROW_NUMBER函数,可通过左连接+区间重叠判断实现:
SELECT a.ID, a.开始日期 AS 表A开始日期, a.结束日期 AS 表A结束日期, b.开始日期 AS 表B开始日期, b.结束日期 AS 表B结束日期 FROM TableA a LEFT JOIN TableB b ON a.ID = b.ID -- 判断B的区间与A的区间存在重叠(包含端点接触的情况) AND b.开始日期 < a.结束日期 AND b.结束日期 > a.开始日期 WHERE -- 保留左连接后的所有有效结果(同ID关联或无匹配) (b.ID IS NULL OR a.ID = b.ID) ORDER BY a.ID, a.开始日期, b.开始日期;
逻辑说明
- 用
LEFT JOIN确保Table A的所有记录都被保留,无匹配的Table B记录对应字段显示NULL - 连接条件中的区间判断逻辑:
b.开始日期 < a.结束日期 AND b.结束日期 > a.开始日期,可以精准匹配两个区间存在重叠的场景(包括B区间完全落在A区间内、部分重叠的情况) WHERE条件确保只保留同ID下的关联结果,过滤掉跨ID的无效匹配- 最后通过
ORDER BY保证结果顺序与目标输出一致
内容的提问来源于stack exchange,提问作者iacopo pacifici
相关产品推荐
相关产品推荐

