Karena Anda menggunakan SQL Server 2012... berikut adalah versi yang menggunakan itu. Ini mungkin lebih cepat daripada solusi lain, tetapi Anda harus mengujinya pada data Anda.
sum() over()
akan melakukan jumlah berjalan yang dipesan oleh Id
menambahkan 1
ketika ada nilai di kolom dan menjaga nilai saat ini untuk null
nilai-nilai. Jumlah berjalan yang dihitung kemudian digunakan untuk mempartisi hasilnya di first_value() over()
. Nilai pertama diurutkan berdasarkan Id
untuk setiap "grup" baris yang dihasilkan oleh jumlah yang berjalan memiliki nilai yang Anda inginkan.
select T.Id,
first_value(T.FeeModeId)
over(partition by T.NF
order by T.Id
rows between unbounded preceding and current row) as FeeModeId,
first_value(T.Name)
over(partition by T.NS
order by T.Id
rows between unbounded preceding and current row) as Name,
T.Amount
from (
select Id,
FeeModeId,
Name,
Amount,
sum(case when FeeModeId is null then 0 else 1 end)
over(order by Id) as NF,
sum(case when Name is null then 0 else 1 end)
over(order by Id) as NS
from YourTable
) as T
Sesuatu yang akan berfungsi sebelum SQL Server 2012:
select T1.Id,
T3.FeeModeId,
T2.Name,
T1.Amount
from YourTable as T1
outer apply (select top(1) Name
from YourTable as T2
where T1.Id >= T2.Id and
T2.Name is not null
order by T2.Id desc) as T2
outer apply (select top(1) FeeModeId
from YourTable as T3
where T1.Id >= T3.Id and
T3.FeeModeId is not null
order by T3.Id desc) as T3