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

同一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;

关键细节说明

  1. PARTITION BY tul_int_UnitId:确保每个单元的租户序号独立计算,避免不同单元的记录混在一起打乱排序逻辑。
  2. LAG()函数:这是实现需求的核心——它能直接获取同一分区(同一单元)内上一条记录的Move_Out_Date,比传统的自关联(比如JOIN表自身匹配序号)性能更好、代码更简洁。
  3. CASE语句处理边界:第一条租户记录没有前置租户,所以对应的空置天数可以返回NULL(表示无前置空置)或者0,具体根据你的业务统计需求调整。

额外扩展(可选)

如果需要计算单元启用后到第一个租户入住的空置,或者最后一个租户搬出到当前日期的空置,可以通过添加虚拟记录的方式实现。例如,联合一个包含单元启用日期和当前日期的临时数据集,再重新计算空置天数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:42:35