Нет необходимости в CURSOR
здесь вообще.Это немного догадка, но я подозреваю то, что вы на самом деле после здесь, выглядит примерно так:
SELECT V.RowID,
V.SKU,
V.Shop,
V.[Week],
V.Priority,
V.Replen,
FIRST_VALUE(V.Open_Stk) OVER (PARTITION BY V.SKU ORDER BY V.[Week], V.Priority
ROWS UNBOUNDED PRECEDING) -
ISNULL(SUM(V.Replen) OVER (PARTITION BY V.SKU ORDER BY V.[Week], V.Priority
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) AS OpenStk
FROM (VALUES (1,111,100,1,1,400,5000),
(2,111,200,1,2,400,NULL),
(3,111,300,1,3,400,NULL),
(4,111,400,1,4,400,NULL))V(RowID,SKU,Shop,[Week],Priority,Replen,Open_Stk)
ORDER BY V.Sku,
V.[Week],
V.Priority;
DB <> Fiddle (используя оригинальный раствор)
FIRST_VALUE
делает то, что говорит на жестяной банке.SUM
вычитает значения из каждой предшествующей строки из значения Open_Stk
в первой строке;сделать окончательный набор результатов.Он ссылается только на предыдущие строки из-за предложения ROWS BETWEEN
.ROWS UNBOUNDED
означает запуск с начала разделенного диапазона, а 1 PRECEDING
означает строку до .