我有一张包含6000万条记录的表格,因此我在撰写不需要花费很多时间的更新时遇到了麻烦。这是表格的样子:
ID Date
1. 2016-05-12
2. NULL
3. 2016-09-17
4. NULL
5. NULL
6. 2016-07-08
我尝试做的是如果它不为空,则使用之前的值更新NULL。不幸的是,我写的所有内容都花了很多时间。有没有办法解决这个问题?
答案 0 :(得分:0)
首先,对大量数据的更新可能需要很长时间。不幸的是,在SQL Server 2008中,您没有lag()
,因此您可以尝试这样的更新:
update t
set date = tt.date
from table t cross apply
(select top 1 t2.date
from table t2
where t2.id < t.id and t2.date is not null
order by t2.id desc
) tt
where t.date is null;
但是,这有一个优化问题,您可以使用计算列和索引来解决这个问题:
alter table t add IsDateNull as (case when date is null then 1 else 0 end);
create index idx_t_IsDateNull_id on t(IsDateNull, id);
然后将此查询写为:
update t
set date = tt.date
from table t cross apply
(select top 1 t2.date
from table t2
where t2.id < t.id and IsDateNull = 0
order by t2.id desc
) tt
where t.date is null;
答案 1 :(得分:0)
您可以通过聚合执行此操作,请参阅下面的示例
create table #test
(
id int,
datee date
)
select * from #test order by id desc
Output:
id datee
1 2014-07-08
2 NULL
3 2015-09-13
4 NULL
5 NULL
6 NULL
- 现在您可以使用以下查询来更新
update #test
set datee=(select min(datee) from #test t2 where t1.id<=t2.id)
from #test t1
以下qquery的最佳索引是
create index nci_test1 on #test(id)
include(datee)