K tomu můžete použít proměnné.
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
Tento dotaz používá 4 proměnné
1) @cur_outcome, který je zpočátku nastaven na prázdný řetězec. Poté select přiřadí aktuálnímu řádku system_outcome.
2) @prev_outcome, který je zpočátku nastaven na prázdný řetězec. Poté jej select nastaví na @cur_outcome (což je poprvé prázdný řetězec a tak dále).
3) @cur_pnum, který je zpočátku nastaven na prázdný řetězec. Poté výběr přiřadí aktuálnímu řádku telefonní číslo.
4) @prev_pnum, který je zpočátku nastaven na prázdný řetězec. Poté jej select nastaví na hodnotu @cur_pnum (což je zpočátku prázdný řetězec).
order by
klauzule je zde důležitá pro označení aktuálních a předchozích řádků na základě telefonního čísla a data.
Nejprve spusťte vnitřní dotaz, abyste viděli, jak jsou proměnné nastaveny, což by vám věci vyjasnilo.
Demo obsahuje některá ukázková data více, než bylo uvedeno v otázce.