Я перевел формулу в рекурсивный CTE:
DECLARE @tbl TABLE (tab VARCHAR(100), rn INT, a INT, b INT);
INSERT INTO @tbl VALUES
('aa', 1, 500, 400),
('aa', 2, 300, 400),
('aa', 3, 200, 500),
('aa', 4, 700, 200),
('aa', 5, 900, 800),
('bb', 1, 500, 400),
('bb', 2, 300, 400),
('bb', 3, 200, 500),
('bb', 4, 700, 200);
WITH rcte AS (
SELECT tab
, rn
, a
, b
, IIF(a > b, b, a) AS c
, IIF(a - b <= 0, -1 * (a - b), 0) AS d
FROM @tbl
WHERE rn = 1
UNION ALL
SELECT curr.tab
, curr.rn
, curr.a
, curr.b
, IIF(curr.a > curr.b + prev.d, curr.b + prev.d, curr.a)
, IIF(curr.a - (curr.b + prev.d) <= 0, -1 * (curr.a - (curr.b + prev.d)), 0)
FROM @tbl AS curr
JOIN rcte AS prev ON curr.tab = prev.tab AND curr.rn = prev.rn + 1
)
SELECT *
FROM rcte
ORDER BY tab, rn
Обратите внимание, что я добавил столбец rn
к данным.Вы можете использовать ROW_NUMBER() OVER (PARTITION BY tab ORDER BY foo)
для генерации этого столбца, если это необходимо.Также обратите внимание, что a - b <= 0
можно записать как a <= b
.
Демо на db <> fiddle