Điều này có thể được thực hiện bằng cách sử dụng giải pháp dựa trên tập hợp:
Tính toán tổng số chạy bình thường (gọi nó là RT)
2. Tính toán mức tối thiểu đang chạy của RT (gọi nó là MN)
Khi MN âm, -MN là tổng số lượng bạn phải bổ sung cho đến nay. Hãy bổ sung_rt là -MN khi MN là âm. Vì vậy, tổng số đang chạy mới (gọi nó là new_rt) là rt + Replace_rt. Và nếu bạn cần trả lại số lượng bổ sung hiện tại cần thiết, hãy trừ số lượng bổ sung hiện tại (sử dụng LAG) cho hiện tại.
Đây là truy vấn giải pháp hoàn chỉnh:
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);Chúc mừng, Itzik