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

SQL Server中如何向下填充Unit No、租户名及保证金字段

SQL Server实现字段向下填充需求

输入数据

IdUnit NoTenant NameNet RentSecurity Deposit
1#k1-30Kkks Pte Ltd12.4115000.12
214.4
316.4
4#K1-40crown Pte Ltd22.60215000.12
524.60
626.60
7#K14-01Techno pv Ltd64.60124230.12
827.60
9#K14-13Gardening26.8021231.12
10#k11-1226.80128237.12

输出结果

IdUnit NoTenant NameNet RentSecurity Deposit
1#k1-30Kkks Pte Ltd12.4115000.12
2#k1-30Kkks Pte Ltd14.4115000.12
3#k1-30Kkks Pte Ltd16.4115000.12
4#K1-40crown Pte Ltd22.60215000.12
5#K1-40crown Pte Ltd24.60215000.12
6#K1-40crown Pte Ltd26.60215000.12
7#K14-01Techno pv Ltd64.60124230.12
8#K14-01Techno pv Ltd27.60124230.12
9#K14-13Gardening26.8021231.12
10#k11-12Gardening26.80128237.12

需求说明

在SQL Server中,需实现Unit No、Tenant Name(租户名称)及Security Deposit(保证金)字段的向下填充操作,仅依赖Unit No作为唯一标识列。场景允许同一租户名称对应不同单元号,且Id为9和10的记录需合并为同一租户名称。

解决方案SQL代码

WITH CTE_FillGroups AS (
    -- 以非空Unit No为分界,划分填充分组
    SELECT 
        Id,
        [Unit No] AS UnitNo,
        [Tenant Name] AS TenantName,
        [Net Rent] AS NetRent,
        [Security Deposit] AS SecurityDeposit,
        COUNT(CASE WHEN [Unit No] IS NOT NULL AND [Unit No] <> '' THEN 1 END) OVER (ORDER BY Id) AS GroupId
    FROM YourTableName
),
CTE_GroupBaseValues AS (
    -- 获取每个分组的基准填充值
    SELECT 
        GroupId,
        MAX([Unit No]) AS FilledUnitNo,
        MAX([Tenant Name]) AS FilledTenantName,
        MAX([Security Deposit]) AS FilledSecurityDeposit
    FROM CTE_FillGroups
    GROUP BY GroupId
)
SELECT 
    f.Id,
    -- 填充空的Unit No
    CASE WHEN f.UnitNo IS NULL OR f.UnitNo = '' THEN g.FilledUnitNo ELSE f.UnitNo END AS [Unit No],
    -- 填充空的Tenant Name,处理Id=10的特殊场景
    CASE 
        WHEN f.TenantName IS NULL OR f.TenantName = '' THEN 
            COALESCE(g.FilledTenantName, 
                     LAST_VALUE(f.TenantName) OVER (ORDER BY Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))
        ELSE f.TenantName 
    END AS [Tenant Name],
    f.NetRent AS [Net Rent],
    -- 填充空的Security Deposit
    CASE WHEN f.SecurityDeposit IS NULL THEN g.FilledSecurityDeposit ELSE f.SecurityDeposit END AS [Security Deposit]
FROM CTE_FillGroups f
JOIN CTE_GroupBaseValues g ON f.GroupId = g.GroupId
ORDER BY f.Id;

代码说明

  1. CTE_FillGroups:利用COUNT() OVER窗口函数,为连续的需填充记录分配分组ID,非空的Unit No作为分组起始标记。
  2. CTE_GroupBaseValues:提取每个分组内的非空基准值,作为填充的来源。
  3. 主查询:关联分组基准值完成常规填充;针对Id=10的情况,通过COALESCE结合LAST_VALUE确保空租户名称能取到上一个有效值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:25:54