You can do this in two steps:
SQL> WITH DATA AS ( 2 SELECT 1 id, 'AA' name FROM DUAL 3 UNION ALL SELECT 2 id, 'AA' name FROM DUAL 4 UNION ALL SELECT 3 id, 'AA' name FROM DUAL 5 UNION ALL SELECT 4 id, 'MB' name FROM DUAL 6 UNION ALL SELECT 5 id, 'MB' name FROM DUAL 7 UNION ALL SELECT 6 id, 'BB' name FROM DUAL 8 UNION ALL SELECT 7 id, 'BB' name FROM DUAL 9 UNION ALL SELECT 8 id, 'ZZ' name FROM DUAL 10 ) 11 SELECT v.*, max(first_step) OVER (PARTITION BY name) nextname 12 FROM (SELECT data.*, 13 nullif(lead(name) OVER (ORDER BY id), name) first_step 14 FROM data) v 15 ORDER BY id; ID NA FI NE ---------- -- -- -- 1 AA MB 2 AA MB 3 AA MB MB 4 MB BB 5 MB BB BB 6 BB ZZ 7 BB ZZ ZZ 8 ZZ
source share