Оригинален отговор е изтрит, не е приложим
Смятам, че това трябва да бъде изпълнимо с един SQL израз, но досега комбинацията от необходимостта от корелирана подзаявка и нуждата от някаква аналитична функция направи всичко, което опитах, неуспешно.
Ето процедурен метод, който според мен ще направи това, което искате:
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;