U kunt hiervoor variabelen gebruiken.
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
Deze zoekopdracht gebruikt 4 variabelen
1) @cur_outcome die aanvankelijk is ingesteld op een lege tekenreeks. Daarna wijst de select de system_outcome van de huidige rij toe.
2) @prev_outcome die aanvankelijk is ingesteld op een lege tekenreeks. Daarna stelt de select het in op @cur_outcome (wat voor de eerste keer een lege string is enzovoort).
3) @cur_pnum die aanvankelijk is ingesteld op een lege string. Daarna wijst de select het telefoonnummer van de huidige rij toe.
4) @prev_pnum die aanvankelijk is ingesteld op een lege tekenreeks. Daarna stelt de select het in op @cur_pnum-waarde (wat aanvankelijk een lege tekenreeks is).
order by
clausule is hier belangrijk om de huidige en vorige rijen aan te wijzen op basis van telefoonnummer en datum.
Voer eerst de innerlijke query uit om te zien hoe de variabelen zijn ingesteld, wat de zaken voor u zou verduidelijken.
De demo bevat meer voorbeeldgegevens dan wat in de vraag werd getoond.