sql >> Database teknologi >  >> RDS >> Mysql

SQL Konsekutive poster med tæller

Du kan bruge variabler til at gøre dette.

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

Denne forespørgsel bruger 4 variabler

1) @cur_outcome som oprindeligt er sat til en tom streng. Derefter tildeler valget den aktuelle rækkes system_outcome.

2) @prev_outcome som oprindeligt er sat til en tom streng. Derefter indstiller select den til @cur_outcome (som er en tom streng for første gang og så videre).

3) @cur_pnum som oprindeligt er sat til en tom streng. Derefter tildeler valget den aktuelle rækkes telefonnummer.

4) @prev_pnum som oprindeligt er sat til en tom streng. Derefter sætter select den til @cur_pnum værdi (som er en tom streng i starten).

order by klausul er vigtig her for at udpege de nuværende og tidligere rækker baseret på telefonnummer og dato.

Kør den indre forespørgsel indledningsvis for at se, hvordan variablerne er indstillet, hvilket ville afklare tingene for dig.

Sample Demo

Demoen indeholder nogle eksempeldata mere end det, der blev vist i spørgsmålet.



  1. Accent- og store og små bogstaver i Oracle med LIKE

  2. Hvordan virker 'in'-klausulen i oracle

  3. mysql 5.7 log-slow-queries fejl

  4. Mysqli join tabeller fra 2 forskellige databaser