Da du er på SQL Server 2012... er her en version, der bruger det. Det kan være hurtigere end andre løsninger, men du skal teste det på dine data.
sum() over()
vil lave en løbende sum sorteret efter Id
tilføjer 1
når der er en værdi i kolonnen og beholder den aktuelle værdi for null
værdier. Den beregnede løbende sum bruges derefter til at opdele resultatet i first_value() over()
. Den første værdi sorteret efter Id
for hver "gruppe" af rækker, der genereres af den løbende sum, har den værdi, du ønsker.
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
Noget der vil fungere før 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