如果以前的值不为null,则为SQL Server更新值

时间:2016-03-20 03:54:45

标签: sql-server-2008 sql-update

我有一张包含6000万条记录的表格,因此我在撰写不需要花费很多时间的更新时遇到了麻烦。这是表格的样子:

ID   Date
 1. 2016-05-12
 2. NULL
 3. 2016-09-17
 4. NULL
 5. NULL
 6. 2016-07-08

我尝试做的是如果它不为空,则使用之前的值更新NULL。不幸的是,我写的所有内容都花了很多时间。有没有办法解决这个问题?

2 个答案:

答案 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)