演算子でそれを行うことができますouter apply
:
select t.id,
t1.colA,
t2.colB,
t3.colC
from table t
outer apply(select top 1 colA from table where id <= t.id and colA is not null order by id desc) t1
outer apply(select top 1 colB from table where id <= t.id and colB is not null order by id desc) t2
outer apply(select top 1 colC from table where id <= t.id and colC is not null order by id desc) t3;
これは、ヌルまたはヌルの「島」の数に関係なく機能します。値、次にヌル、そして再び値、再びヌルを持つことができます。それはまだ動作します。
ただし、(質問の)仮定が成り立つ場合:
を取得したらNULL
、NULL
最後まですべてです。そのため、最新の値で埋めたいと思います。
より効率的な解決策があります。idx
最新の ( で並べ替えた場合) 値を見つけるだけで済みます。where id <= t.id
上記のクエリを変更し、サブクエリからを削除します。
select t.id,
colA = coalesce(t.colA, t1.colA),
colB = coalesce(t.colB, t2.colB),
colC = coalesce(t.colC, t3.colC)
from table t
outer apply (select top 1 colA from table
where colA is not null order by id desc) t1
outer apply (select top 1 colB from table
where colB is not null order by id desc) t2
outer apply (select top 1 colC from table
where colC is not null order by id desc) t3;