Respuesta original eliminada, no viable
Siento que esto debería ser factible en una sola instrucción SQL, pero hasta ahora la combinación de la necesidad de una subconsulta correlacionada y la necesidad de algún tipo de función analítica ha hecho que todo lo que intenté falle.
Aquí hay un método de procedimiento que creo que hará lo que quieras:
DECLARE
CURSOR t IS
SELECT LEAD(contractid,4) OVER (PARTITION BY assetid ORDER BY lasttradedate ASC) lead_contractid
FROM table1
FOR UPDATE;
BEGIN
FOR r IN t LOOP
UPDATE table1 SET nextcontractid = r.lead_contractid
WHERE CURRENT OF t;
END LOOP;
END;