Usunięta oryginalna odpowiedź, niewykonalna
Uważam, że powinno to być wykonalne w jednej instrukcji SQL, ale jak dotąd połączenie potrzeby skorelowanego podzapytania i potrzeby jakiejś funkcji analitycznej sprawiło, że wszystko, co próbowałem, zakończyło się niepowodzeniem.
Oto metoda proceduralna, która moim zdaniem zrobi to, co chcesz:
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;