Here is a solution for you with no tampering with original table.
DECLARE @Sample TABLE (ID INT, Version INT)
INSERT @Sample
SELECT 1, 1 UNION ALL
SELECT 1, NULL UNION ALL
SELECT 1, NULL UNION ALL
SELECT 4, 1 UNION ALL
SELECT 4, 3 UNION ALL
SELECT 4, NULL
SELECT *
FROM @Sample
DECLARE @MinVersion INT,
@MaxVersion INT,
@MinID INT,
@MaxID INT
SELECT @MinVersion = 1,
@MaxVersion = MAX(Version),
@MinID = MIN(ID),
@MaxID = MAX(ID)
FROM @Sample
SET ROWCOUNT 1
WHILE @MinVersion <= @MaxVersion
BEGIN
WHILE @MinID <= @MaxID
BEGIN
IF NOT EXISTS (SELECT * FROM @Sample WHERE ID = @MinID AND Version = @MinVersion)
UPDATE @Sample
SET Version = @MinVersion
WHERE ID = @MinID
AND Version IS NULL
SELECT @MinID = MIN(ID)
FROM @Sample
WHERE ID > @MinID
END
SELECT @MinVersion = @MinVersion + 1,
@MinID = MIN(ID)
FROM @Sample
END
SET ROWCOUNT 0
SELECT *
FROM @Sample
|