Ini dapat dilakukan dengan menggunakan solusi berbasis himpunan:
1.Hitung total berjalan normal (sebut saja RT)
2.Hitung running minimum RT (sebut saja MN)
Ketika MN negatif, -MN adalah jumlah total yang harus Anda isi ulang sejauh ini. Biarkan isi_rt menjadi -MN ketika MN negatif. Jadi, total running baru (sebut saja new_rt) adalah rt + recharge_rt. Dan jika Anda perlu mengembalikan jumlah pengisian saat ini yang diperlukan, kurangi pengisian_rt sebelumnya (menggunakan LAG) dari arus.
Inilah kueri solusi lengkapnya:
with c1 as ( select *, sum(qty) over(order by tdate rows unbounded preceding) as rt from tx ), c2 as ( select *, -- when negative, mn is the total qty that had to be -- replenished until now, inclusive min(rt) over(order by tdate rows unbounded preceding) as mn_cur from c1 ) select tdate, qty, rt, replenish_rt - lag(replenish_rt, 1, 0) over(order by tdate) as replenish, rt + replenish_rt as new_rt from c2 cross apply(values(case when mn_cur < 0 then -mn_cur else 0 end)) as a1(replenish_rt);Semangat, Itzik