DROP TABLE IF EXISTS T;
GO
CREATE TABLE T (
ID int identity(1,1) PRIMARY KEY,
Parent int Foreign Key REFERENCES T(ID),
SortingNumber int, b int, c int);
GO
INSERT INTO T(Parent, SortingNumber, b, c)
VALUES
(1, 3, 1, -3),
(1, 4, 2, 4),
(1, 5, 1, NULL),
(2, 8, 3, 1),
(2, 10, 2, NULL),
(2, 13, 1, 5);
SELECT * FROM T;
DECLARE @lastSO INTEGER = 0;
WITH toUpdate AS(
SELECT
T1.*,
LAG(T1.SortingNumber + 1, 1, 1) OVER (ORDER BY T1.SortingNumber) AS [newSortNumber]
FROM T AS T1
INNER JOIN T AS T2
ON T2.ID = T1.Parent
)
UPDATE toUpdate
SET
@lastSO = CASE WHEN [newSortNumber] = 1 AND @lastSO = 0 THEN 1 ELSE @lastSO + 1 END,
toUpdate.SortingNumber = @lastSO
;
SELECT * FROM T;