Původní odpověď byla smazána, není životaschopná
Mám pocit, že by to mělo být proveditelné v jediném příkazu SQL, ale zatím kombinace potřeby korelovaného poddotazu a potřeby nějaké analytické funkce způsobila, že všechno, co jsem zkoušel, selhalo.
Zde je procedurální metoda, o které si myslím, že udělá to, co chcete:
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;