我有一个看起来像这样的表:
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
谢谢!
答案 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