W tym celu możesz użyć zmiennych.
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
To zapytanie używa 4 zmiennych
1) @cur_outcome, który jest początkowo ustawiony na pusty ciąg. Następnie zaznaczenie przypisuje wynik systemowy bieżącego wiersza.
2) @prev_outcome, który jest początkowo ustawiony na pusty ciąg. Następnie zaznaczenie ustawia go na @cur_outcome (który jest pustym ciągiem za pierwszym razem i tak dalej).
3) @cur_pnum, który początkowo jest ustawiony na pusty ciąg. Następnie zaznaczenie przypisuje numer telefonu bieżącego wiersza.
4) @prev_pnum, który jest początkowo ustawiony na pusty ciąg. Następnie zaznaczenie ustawia ją na wartość @cur_pnum (która początkowo jest pustym ciągiem).
order by
klauzula jest tutaj ważna, aby określić bieżący i poprzedni wiersz na podstawie numeru telefonu i daty.
Najpierw uruchom wewnętrzne zapytanie, aby zobaczyć, jak ustawione są zmienne, co wyjaśni ci sprawę.
Demo zawiera więcej przykładowych danych, niż pokazano w pytaniu.