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
相关产品推荐
相关产品推荐

