Here is one way:-- Sample DataDECLARE @T TABLE (ID INT, A INT, B VARCHAR(4), C VARCHAR(2))INSERT @TSELECT 1 , 132 , 'Bd32', 'A1'UNION ALL SELECT 2 , NULL, NULL, 'B6'UNION ALL SELECT 3 , NULL, NULL, 'B7'UNION ALL SELECT 4 , 512 , 'AX44', 'B1'UNION ALL SELECT 5 , NULL, NULL, 'B8'UNION ALL SELECT 6 , NULL, NULL, 'B1'-- Run UpdateUPDATE TSET A = D.A, B = D.BFROM @T AS TOUTER APPLY( SELECT B.* FROM ( SELECT MAX(ID) AS ID FROM @T WHERE A IS NOT NULL AND ID < T.ID ) AS A INNER JOIN @T AS B ON A.ID = B.ID) AS D-- Verify ResultsSELECT *FROM @T AS T
This assumes that both A and B with both NULL. If not you might need to run two updates or change the logic.