sql >> Databasteknik >  >> RDS >> Oracle

Hur räknar man på varandra följande dubbletter i en tabell?

Det kan göras med Tabibitosan-metoden. Kör detta för att förstå det:

with a as(
select 1 slno, 'A' pg from dual union all
select 2 slno, 'A' pg from dual union all
select 3 slno, 'B' pg from dual union all
select 4 slno, 'A' pg from dual union all
select 5 slno, 'A' pg from dual union all
select 6 slno, 'A' pg from dual 
)
select slno, pg, newgrp, sum(newgrp) over (order by slno) grp
from( 
    select slno, 
           pg, 
           case when pg <> nvl(lag(pg) over (order by slno),1) then 1 else 0 end newgrp
    from a
    );

Newgrp betyder att en ny grupp hittas.

Resultat:

SLNO PG NEWGRP GRP
1    A  1      1
2    A  0      1
3    B  1      2
4    A  1      3
5    A  0      3
6    A  0      3

Nu använder du bara en grupp efter med räkning för att hitta gruppen med maximalt antal förekomster:

with a as(
select 1 slno, 'A' pg from dual union all
select 2 slno, 'A' pg from dual union all
select 3 slno, 'B' pg from dual union all
select 4 slno, 'A' pg from dual union all
select 5 slno, 'A' pg from dual union all
select 6 slno, 'A' pg from dual 
),
b as(
select slno, pg, newgrp, sum(newgrp) over (order by slno) grp
from( 
    select slno, pg, case when pg <> nvl(lag(pg) over (order by slno),1) then 1 else 0 end newgrp
    from a
    )
)
select max(cnt)
from (
    select grp, count(*) cnt
    from b
    group by grp
    );


  1. MySQL-index och ordning

  2. Så här arbetar du med PL/SQL-arrayer eller samlingar som parametrar och SLUTAR sedan dem tillsammans med index

  3. Infoga i tabell välj från tabell a och tabell b där

  4. Hur man refererar till en sammansatt primärnyckel i SQL