使用同一列中的数据填充列

时间:2016-01-04 22:41:22

标签: sql sql-server sql-server-2012 sql-update

我有一个看起来像这样的表:

Symbol    | Date    |    Version    |    Value
abc       | 20120101|    1          |    NULL
abc       | 20120101|    4          |    25
abc       | 20120101|    14         |    NULL
abc       | 20120101|    34         |    123
abc       | 20120101|    42         |    35
abc       | 20120101|    45         |    NULL

我需要更新它,看起来像这样:

Symbol    | Date    |    Version    |    Value
abc       | 20120101|    1          |    NULL
abc       | 20120101|    4          |    25
abc       | 20120101|    14         |    25
abc       | 20120101|    34         |    123
abc       | 20120101|    42         |    35
abc       | 20120101|    45         |    35

也就是说,每当Value列中都有NULL时,我需要根据Version对应给定的符号和日期填充最后一个非null值。

我尝试使用UPDATE和JOIN,但我不知道如何确保它使用最新版本的非NULL值,而不是任何以前的版本。

这就是我的尝试:

UPDATE c1
SET c1.value = c2.value
FROM myTable updateC
JOIN myTable AS lookupC
ON 
    updateC.symbol = lookupC.symbol AND
    updateC.date = lookupC.date 
WHERE
    lookupC.firstRunId = (SELECT MAX(version) FROM      myTable c3 WHERE c3.version < updateC.version) AND 
updateC.value IS NULL and lookupC.value IS NOT NULL

谢谢!

1 个答案:

答案 0 :(得分:4)

或许最简单的方法是使用相关的子查询:

update myTable t
    set value = (select top 1 t2.value
                 from myTable t2
                 where t2.symbol = t.symbol and t2.date = t.date and
                       t2.version < t.version and t2.value is not null
                 order by t2.version desc
                )
    where t.value is null;

这将从mytable(symbol, date, version)的索引中获益(性能方面)。

注意:您真正想要的是IGNORE NULLS的{​​{1}}关键字。但是,SQL Server(尚未)支持此功能。

编辑:

还有另一种方法可以使用LAG()和窗口函数来表达这一点:

JOIN