sql-server - 用最后一个非空值填充空行值 - SQL 表

标签 sql-server null

我正在努力解决以下问题。考虑下面发布的示例表。我需要做的是更新表,特别是使用“最后”非 NULL 值更新每行上的 NULL 值。例如,第3行和第4行的NULL值应该更新为同一列的第2行的值,即

2   007585102   2001 03 31   2001 04 12   2   154980   6300   154980   6300  
3   007585102   2001 03 31   2001 04 19   2   154980   6300   154980   6300  
4   007585102   2001 03 31   2001 04 26   2   154980   6300   154980   6300
第 9 行到第 15 行的

和 NULL 值更新为第 8 行的值,依此类推。 老实说,我不知道该怎么做,我将非常感谢任何帮助。提前致谢。

很抱歉表格的格式非常糟糕,但我只能发布纯文本之外的任何内容。

示例表

1    007585102   2001 03 31   2001 04 05   2    543660   22100   543660   22100  
2    007585102   2001 03 31   2001 04 12   2    154980   6300    154980    6300  
3    007585102       NULL     2001 04 19  NULL      NULL    NULL        NULL        NULL  
4    007585102       NULL     2001 04 26  NULL      NULL    NULL        NULL        NULL  
5    007585102   2001 03 31   2001 05 03   2    2726664  110840 2726664 110840  
6    007585102   2001 03 31   2001 05 10   2    836400   34000   836400   34000  
7    007585102   2001 03 31   2001 05 17   2    534804   21740   7634364  310340  
8    007585102   2001 03 31   2001 05 24   2    4920      200      4920       200  
9    007585102       NULL     2001 05 31   NULL     NULL    NULL        NULL    NULL    
10   007585102       NULL     2001 06 07  NULL      NULL    NULL        NULL    NULL  
11   007585102       NULL     2001 06 14  NULL      NULL    NULL        NULL    NULL   
12   007585102       NULL     2001 06 21  NULL      NULL    NULL        NULL    NULL   
13   007585102       NULL     2001 06 28  NULL      NULL    NULL        NULL    NULL   
14   007585102       NULL     2001 07 05  NULL      NULL    NULL        NULL    NULL  
15   007585102       NULL     2001 07 12  NULL      NULL    NULL        NULL    NULL  
16   007585102   2001 06 30   2001 07 19   2    2693301   118300   2693301   118300  
17   007585102   2001 06 30   2001 07 26   2    232220    10200    NULL    NULL  

最佳答案

我对自己的答案并不感到自豪,但至少它有效。自己寻找更优雅的方式。我建议递归 cte。

drop table #temp
GO
select 
    *
into #temp
from (
    select 1 as id, '2001 03 31' as dat union all
    select 2, '2001 03 31' union all
    select 3, null union all
    select 4, null union all
    select 5, '2001 03 31' union all
    select 6, '2001 03 31' union all
    select 7, '2001 03 31' union all
    select 8, '2001 03 31' union all
    select 9, null union all
    select 10, null union all
    select 11, null union all
    select 12, null union all
    select 13, null union all
    select 14, null union all
    select 15, null union all
    select 16, '2001 06 30' union all
    select 17, '2001 06 30'
) x

update t
set
    t.dat = t2.dat
from #temp t
join (
    select 
        t1.id, max(t2.id) as maxid
    from #temp t1
    join #temp t2
        on t1.id>t2.id
        and t2.dat is not null 
        and t1.dat is null 
    group by 
        t1.id
) x
    on t.id=x.id
join #temp t2
    on t2.id=x.maxid

select * from #temp

关于sql-server - 用最后一个非空值填充空行值 - SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203750/

相关文章:

sql-server - 编写用户到特定数据库的脚本?

sql-server - SQL Server 2005 - 在不同的服务器上恢复加密的数据库

sql - 如果找不到值,如何从函数返回值

sql - 如何将带有字符串的列中的空白转换为空值

带有 LEFT JOIN 的 MySQL SELECT 意外地将 NULL 插入每个分区的第一行

c++ - 使用 Windows 7 在 VS 中取消引用 null

sql-server - 在 Power BI 卡中,我可以在数据标签上方显示标题吗?

c# - 在 sql asp.net 中获取过去 30 天未登录的用户

mysql - 同时按两列排序 SQL

MySQL Sum 只有特定类别 0 否则