Puoi usare le variabili per farlo.
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
Questa query utilizza 4 variabili
1) @cur_outcome inizialmente impostato su una stringa vuota. Successivamente il select assegna il system_outcome della riga corrente.
2) @prev_outcome inizialmente impostato su una stringa vuota. Successivamente il select lo imposta su @cur_outcome (che è una stringa vuota per la prima volta e così via).
3) @cur_pnum che inizialmente è impostato su una stringa vuota. Successivamente il select assegna il numero di telefono della riga corrente.
4) @prev_pnum che inizialmente è impostato su una stringa vuota. Successivamente select lo imposta sul valore @cur_pnum (che inizialmente è una stringa vuota).
order by
La clausola è importante qui per designare la riga corrente e quella precedente in base a numero_telefono e data.
Esegui inizialmente la query interna per vedere come sono impostate le variabili, il che chiarirebbe le cose per te.
La demo contiene alcuni dati di esempio in più rispetto a quanto mostrato nella domanda.