Ho fatto una cosa del genere e sembra funzionare :
with OrdineinTabella as (
select
call_id
, num_progressivo
, codice
from test2
)
, OrdineSuccessivodiUno as (
select
call_id
, num_progressivo
, codice
, LEAD(codice ) OVER ( partition by call_id ORDER BY num_progressivo ) CodiceSuccessivodiUno
, LEAD(num_progressivo) OVER ( partition by call_id ORDER BY num_progressivo ) AS num_progressivoDopo
from test2
)
, OrdineSuccessivodiDue as (
select
call_id
, num_progressivo
, codice
, LEAD(codice,2) OVER ( partition by call_id ORDER BY num_progressivo ) CodiceSuccessivodiDue
, LEAD(num_progressivo,2) OVER ( partition by call_id ORDER BY num_progressivo ) AS num_progressivodiDue
from test
)
select
a.num_progressivo as num_progrreale
, a.codice as codicereale
, b.CodiceSuccessivodiUno
, c.CodiceSuccessivodiDue
from OrdineinTabella a
INNER JOIN OrdineSuccessivodiUno b on (a.call_id = b.call_id and a.num_progressivo = b.num_progressivo)
INNER JOIN OrdineSuccessivodiDue c on (b.call_id = c.call_id and b.num_progressivo = c.num_progressivo)
WHERE
CodiceSuccessivodiUno != a.codice AND c.CodiceSuccessivodiDue is null