sql >> Databáze >  >> RDS >> Mysql

SQL Po sobě jdoucí záznamy s počtem

K tomu můžete použít proměnné.

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

Tento dotaz používá 4 proměnné

1) @cur_outcome, který je zpočátku nastaven na prázdný řetězec. Poté select přiřadí aktuálnímu řádku system_outcome.

2) @prev_outcome, který je zpočátku nastaven na prázdný řetězec. Poté jej select nastaví na @cur_outcome (což je poprvé prázdný řetězec a tak dále).

3) @cur_pnum, který je zpočátku nastaven na prázdný řetězec. Poté výběr přiřadí aktuálnímu řádku telefonní číslo.

4) @prev_pnum, který je zpočátku nastaven na prázdný řetězec. Poté jej select nastaví na hodnotu @cur_pnum (což je zpočátku prázdný řetězec).

order by klauzule je zde důležitá pro označení aktuálních a předchozích řádků na základě telefonního čísla a data.

Nejprve spusťte vnitřní dotaz, abyste viděli, jak jsou proměnné nastaveny, což by vám věci vyjasnilo.

Sample Demo

Demo obsahuje některá ukázková data více, než bylo uvedeno v otázce.



  1. Jaký je rozdíl mezi funkcemi RANK() a DENSE_RANK() v oracle?

  2. Jak získat všechny tabulky, které mají omezení primárního klíče vytvořené v databázi SQL Server - SQL Server / TSQL výukový program 57

  3. SQL:Jak najít duplikáty na základě dvou polí?

  4. Oracle – ORA-06502:PL/SQL:numerická nebo hodnotová chyba (DBMS_OUTPUT)