Vì bạn đang sử dụng SQL Server 2012 ... đây là phiên bản sử dụng điều đó. Nó có thể nhanh hơn các giải pháp khác nhưng bạn phải kiểm tra điều đó trên dữ liệu của mình.
sum() over()
sẽ thực hiện một số tiền đang chạy được sắp xếp theo Id
thêm 1
khi có một giá trị trong cột và giữ giá trị hiện tại cho null
các giá trị. Sau đó, tổng đang chạy được tính toán được sử dụng để phân vùng kết quả trong first_value() over()
. Giá trị đầu tiên được sắp xếp theo Id
cho mỗi "nhóm" hàng được tạo bởi tổng đang chạy có giá trị bạn muốn.
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
Một cái gì đó sẽ hoạt động trước 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