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

基于日期区间关联两张表的SQL查询(禁用RANK/ROW_NUMBER)

日期区间关联SQL查询实现

现有两张包含日期区间的表 Table A 和 Table B,表结构及数据如下:

Table A

ID开始日期结束日期
101/01/202410/01/2024
110/01/202415/01/2024
115/01/202420/01/2024
201/01/202410/01/2024
210/01/202420/01/2024

Table B

ID开始日期结束日期
110/01/202411/01/2024
112/01/202418/01/2024
210/01/202410/01/2024

需要生成如下指定输出结果:

目标输出

ID表A开始日期表A结束日期表B开始日期表B结束日期
101/01/202410/01/2024NULLNULL
110/01/202415/01/202410/01/202411/01/2024
110/01/202415/01/202412/01/202418/01/2024
115/01/202420/01/2024NULLNULL
210/01/202420/01/202410/01/202410/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:12:48