Slettet originalt svar, ikke levedygtigt
Jeg føler, at dette burde kunne lade sig gøre i en enkelt SQL-sætning, men indtil videre har kombinationen af behovet for en korreleret underforespørgsel og behovet for en slags analytisk funktion fået alt, hvad jeg prøvede, til at mislykkes.
Her er en proceduremæssig metode, som jeg tror vil gøre, hvad du vil:
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;