Você pode usar variáveis para fazer isso.
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 usa 4 variáveis
1) @cur_outcome que é inicialmente definido como uma string vazia. Depois disso, o select atribui o system_outcome da linha atual.
2) @prev_outcome que é inicialmente definido como uma string vazia. Depois disso, o select o define como @cur_outcome (que é uma string vazia pela primeira vez e assim por diante).
3) @cur_pnum que é inicialmente definido como uma string vazia. Em seguida, o select atribui o phone_number da linha atual.
4) @prev_pnum que é inicialmente definido como uma string vazia. Depois disso, o select o define para o valor @cur_pnum (que é uma string vazia inicialmente).
order by
A cláusula é importante aqui para designar as linhas atuais e anteriores com base em phone_number e date. Execute a consulta interna inicialmente para ver como as variáveis são definidas, o que esclareceria as coisas para você.
Sample Demo
A demonstração contém alguns dados de amostra a mais do que foi mostrado na pergunta.