Можете да използвате променливи, за да направите това.
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
Тази заявка използва 4 променливи
1) @cur_outcome, който първоначално е настроен на празен низ. След това изборът присвоява system_outcome на текущия ред.
2) @prev_outcome, който първоначално е настроен на празен низ. След това изборът го задава на @cur_outcome (който е празен низ за първи път и така нататък).
3) @cur_pnum, който първоначално е настроен на празен низ. След това изборът присвоява телефонния номер на текущия ред.
4) @prev_pnum, който първоначално е настроен на празен низ. След това изборът го задава на стойност @cur_pnum (която първоначално е празен низ).
order by
клаузата е важна тук за обозначаване на текущите и предишните редове въз основа на телефонен номер и дата.
Изпълнете първоначално вътрешната заявка, за да видите как са зададени променливите, което ще ви изясни нещата.
Демонстрацията съдържа някои примерни данни повече от това, което беше показано във въпроса.