Mysql
 sql >> Base de données >  >> RDS >> Mysql

Enregistrements consécutifs SQL avec nombre

Vous pouvez utiliser des variables pour ce faire.

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

Cette requête utilise 4 variables

1) @cur_outcome qui est initialement défini sur une chaîne vide. Ensuite, la sélection attribue le system_outcome de la ligne actuelle.

2) @prev_outcome qui est initialement défini sur une chaîne vide. Ensuite, la sélection le définit sur @cur_outcome (qui est une chaîne vide pour la première fois et ainsi de suite).

3) @cur_pnum qui est initialement défini sur une chaîne vide. Ensuite, la sélection attribue le numéro de téléphone de la ligne actuelle.

4) @prev_pnum qui est initialement défini sur une chaîne vide. Par la suite, la sélection le définit sur la valeur @cur_pnum (qui est initialement une chaîne vide).

order by La clause est importante ici pour désigner les lignes actuelles et précédentes en fonction du numéro de téléphone et de la date.

Exécutez d'abord la requête interne pour voir comment les variables sont définies, ce qui clarifierait les choses pour vous.

Sample Demo

La démo contient des exemples de données de plus que ce qui a été montré dans la question.