Puedes usar variables para hacer esto.
select phone_number from (
select c.*,
@prev_outcome:[email protected]_outcome,
@cur_outcome:=system_outcome,
@prev_pnum:[email protected]_pnum,
@cur_pnum:=phone_number,
case when @cur_pnum = @prev_pnum and @prev_outcome <> @cur_outcome then @rn:[email protected]+1
when @cur_pnum = @prev_pnum and @prev_outcome = @cur_outcome then @rn:[email protected]
else @rn:=1 end as rank
from calls c,
(select @rn:=0,@prev_pnum:='',@cur_pnum:='',@prev_outcome:='',@cur_outcome:='') r
order by phone_number,dt
) x
where system_outcome='No Answer'
group by phone_number,rank
having count(*) > 6
Esta consulta utiliza 4 variables
1) @cur_outcome que inicialmente se establece en una cadena vacía. A partir de entonces, la selección asigna el system_outcome de la fila actual.
2) @prev_outcome que inicialmente se establece en una cadena vacía. A partir de entonces, la selección lo establece en @cur_outcome (que es una cadena vacía por primera vez y así sucesivamente).
3) @cur_pnum que inicialmente se establece en una cadena vacía. A partir de entonces, la selección asigna el número de teléfono de la fila actual.
4) @prev_pnum que inicialmente se establece en una cadena vacía. A partir de entonces, la selección lo establece en el valor @cur_pnum (que inicialmente es una cadena vacía).
order by
La cláusula es importante aquí para designar las filas actuales y anteriores en función del número de teléfono y la fecha.
Ejecute la consulta interna inicialmente para ver cómo se establecen las variables, lo que le aclararía las cosas.
La demostración contiene algunos datos de muestra más de lo que se muestra en la pregunta.