Trong SQL Server 2008, bạn bị hạn chế nghiêm trọng vì bạn không thể sử dụng các hàm phân tích. Cách sau không hiệu quả nhưng sẽ giải quyết được vấn đề của bạn:
with tg as (
select t.*, g.grp
from t cross apply
(select count(*) as grp
from t t2
where t2.pk <= t.pk and t2.pk = 0
) g
)
select tg.*, p.running_price
from tg cross apply
(select sum(tg2.price) as running_price
from tg tg2
where tg2.grp = tg.grp and tg2.pk <= tg.pk
) p;
Than ôi, trước SQL Server 2012, giải pháp hiệu quả nhất có thể liên quan đến con trỏ. Trong SQL Server 2012+, bạn chỉ cần thực hiện:
select t.*,
sum(price) over (partition by grp order by pk) as running_price
from (select t.*,
sum(case when price = 0 then 1 else 0 end) over (order by pk) as grp
from t
) t;