Risposta originale eliminata, non valida
Ritengo che ciò dovrebbe essere fattibile in una singola istruzione SQL, ma finora la combinazione della necessità di una sottoquery correlata e della necessità di una sorta di funzione analitica ha fatto fallire tutto ciò che ho provato.
Ecco un metodo procedurale che penso farà quello che vuoi:
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;