同一UnitID下跨行日期差值计算:商业地产单元空置天数求解咨询
解决方案:计算商业地产单元的租户间空置时长
当然可以!你的思路完全找对了方向——通过给按时间排序的租户记录分配连续序号,再关联上一条记录的搬出日期,就能精准算出租户之间的空置天数。不过现在主流SQL数据库都支持窗口函数,用它来实现会比手动处理序号+自关联更简洁高效。
修改后的查询语句
SELECT uni_vch_UnitNo AS UnitNumber, uty_vch_Code AS UnitCode, uty_int_Id AS UnitID, tul_int_FacilityId AS FacilityID, tul_dtm_MoveInDate AS Move_In_Date, tul_dtm_MoveOutDate AS Move_Out_Date, -- 计算当前租户的实际占用天数 DATEDIFF(day, tul_dtm_MoveInDate, tul_dtm_MoveOutDate) AS Occupancy_Days, -- 给每个单元的租户记录按入住日期分配连续序号 ROW_NUMBER() OVER (PARTITION BY tul_int_UnitId ORDER BY tul_dtm_MoveInDate ASC) AS Lease_Sequence, -- 获取上一租户的搬出日期(同一单元内的前一条记录) LAG(tul_dtm_MoveOutDate) OVER (PARTITION BY tul_int_UnitId ORDER BY tul_dtm_MoveInDate ASC) AS Previous_MoveOut_Date, -- 计算空置天数,自动处理第一条记录(无前置租户的情况) CASE WHEN LAG(tul_dtm_MoveOutDate) OVER (PARTITION BY tul_int_UnitId ORDER BY tul_dtm_MoveInDate ASC) IS NOT NULL THEN DATEDIFF(day, LAG(tul_dtm_MoveOutDate) OVER (PARTITION BY tul_int_UnitId ORDER BY tul_dtm_MoveInDate ASC), tul_dtm_MoveInDate) ELSE NULL -- 若不需要显示第一条记录的空置(因为没有前置租户),可改为0 END AS Vacancy_Days FROM TenantUnitLeases JOIN units ON tul_int_UnitId = uni_int_UnitId JOIN UnitTypes ON uni_int_UnitTypeId = uty_int_Id WHERE tul_int_UnitId = '26490' ORDER BY tul_dtm_MoveInDate ASC;
关键细节说明
PARTITION BY tul_int_UnitId:确保每个单元的租户序号独立计算,避免不同单元的记录混在一起打乱排序逻辑。LAG()函数:这是实现需求的核心——它能直接获取同一分区(同一单元)内上一条记录的Move_Out_Date,比传统的自关联(比如JOIN表自身匹配序号)性能更好、代码更简洁。CASE语句处理边界:第一条租户记录没有前置租户,所以对应的空置天数可以返回NULL(表示无前置空置)或者0,具体根据你的业务统计需求调整。
额外扩展(可选)
如果需要计算单元启用后到第一个租户入住的空置,或者最后一个租户搬出到当前日期的空置,可以通过添加虚拟记录的方式实现。例如,联合一个包含单元启用日期和当前日期的临时数据集,再重新计算空置天数。
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

