假設我們使用ID
列確定順序,您可以不使用循環。
無論您要做,這是另一回事 - 它並不漂亮:
declare @t table (ID int, Date date, D1 int, D2 char(1), D3 char(1))
insert into @t(ID, Date, D1, D2, D3) values
(1,'20130101',0,'X','A'),
(2,'20130201',null,null,null),
(3,'20130301',1,null,null),
(4,'20130401',null,null,'B'),
(5,'20130501',null,null,null)
update a
set
a.D1 = COALESCE(a.D1,d1.D1),
a.D2 = COALESCE(a.D2,d2.D2),
a.D3 = COALESCE(a.D3,d3.D3)
from
@t a
left join
@t D1
on
D1.ID < a.ID and
D1.D1 IS NOT NULL
left join
@t D1_anti
on
D1_anti.ID < a.ID and
D1_anti.D1 is not null and
D1_anti.ID > D1.ID
left join
@t D2
on
D2.ID < a.ID and
D2.D2 IS NOT NULL
left join
@t D2_anti
on
D2_anti.ID < a.ID and
D2_anti.D2 is not null and
D2_anti.ID > D2.ID
left join
@t D3
on
D3.ID < a.ID and
D3.D3 IS NOT NULL
left join
@t D3_anti
on
D3_anti.ID < a.ID and
D3_anti.D3 is not null and
D3_anti.ID > D3.ID
where
D1_anti.ID is null and
D2_anti.ID is null and
D3_anti.ID is null
select * from @t
基本上,我們執行連接,試圖找到可以適用早先的行,然後執行_anti
連接以確保每個找到的前一行是存在的最新這樣的行。
你使用的是什麼rdbms? –
您是否將前一個定義爲「帶有下一個最低的」ID「值」?或者「下一個最低的日期值」?或者你有其他的定義你想使用?表本質上是無序的。如果你想做一些涉及秩序的事情,你必須給我們一個明確的規則來定義這個秩序。 –