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

SQL技术需求:获取房屋到期合同的首个后续合同并同行展示

解决PMCCONTRACT表中房屋首个后续合同关联问题

你需要给每套房屋的旧合同匹配上首个后续入住的新合同,同时保证每个CONTRACTID只出现一次,之前的查询会返回所有符合条件的后续合同,那可以用窗口函数ROW_NUMBER()来精准实现这个需求,下面是调整后的SQL:

SELECT 
    P1.CONTRACTID,
    P1.RENTALOBJECTID,
    P1.VALIDFROM AS OldContractStartDate,
    P1.VALIDTO AS OldContractEndDate,
    P2.CONTRACTID AS FirstNextContractId,
    P2.VALIDFROM AS NextContractStartDate,
    P2.VALIDTO AS NextContractEndDate,
    -- 直接计算新旧合同的间隔天数,满足你的统计需求
    DATEDIFF(day, P1.VALIDTO, P2.VALIDFROM) AS DaysBetweenTenants
FROM PMCCONTRACT P1
LEFT JOIN (
    SELECT 
        RENTALOBJECTID,
        CONTRACTID,
        VALIDFROM,
        VALIDTO,
        -- 按房屋分组,将该房屋的所有合同按开始日期升序排序,最早的后续合同会被标记为RowNum=1
        ROW_NUMBER() OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM ASC) AS RowNum
    FROM PMCCONTRACT
) P2 
    ON P1.RENTALOBJECTID = P2.RENTALOBJECTID
    -- 确保新合同在旧合同到期之后才开始
    AND P2.VALIDFROM > P1.VALIDTO
    -- 只取每个房屋里最早的那个后续合同
    AND P2.RowNum = 1
-- 如果需要只查看已经到期的旧合同,可以保留这个WHERE条件;如果要包含未到期的,直接去掉即可
WHERE P1.VALIDTO IS NOT NULL
ORDER BY P1.RENTALOBJECTID, P1.VALIDTO;

逻辑说明:

  • 子查询P2中,用PARTITION BY RENTALOBJECTID给每套房屋的合同分组,再通过ORDER BY VALIDFROM ASC把该房屋的合同按开始时间排序,最早的新合同会被分配RowNum=1。
  • 主查询里通过LEFT JOIN关联旧合同和子查询结果,只匹配RowNum=1且开始时间晚于旧合同到期时间的记录,这样就保证每个旧合同只会对应一行首个后续合同的数据,完美满足你要求的CONTRACTID唯一性。
  • 额外加上了DaysBetweenTenants字段,直接帮你计算出房屋空置的间隔天数,省去后续统计的步骤。

内容的提问来源于stack exchange,提问作者titatovenaar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:22:57