SQL Server 2012を使用しているので、これを使用するバージョンがあります。他のソリューションよりも高速かもしれませんが、データでテストする必要があります。
sum() over()
Id
で並べ替えられた現在の合計を実行します 1
を追加する 列に値があり、null
の現在の値を保持している場合 値。次に、計算されたランニングサムを使用して、結果をfirst_value() over()
に分割します。 。 Id
で並べ替えられた最初の値 ランニングサムによって生成された行の「グループ」ごとに、必要な値があります。
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
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