sql >> データベース >  >> RDS >> Oracle

テーブル内の連続した重複をカウントする方法は?

    それはタビビトサン法で行うことができます。これを実行して理解してください:

    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は、新しいグループが見つかったことを意味します。

    結果:

    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
    

    ここで、countを使用してgroup byを使用し、発生回数が最大のグループを見つけます。

    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. クエリ結果とnum行の両方を返します

    2. SybaseASEのMYSQLgroup_concatと同等ですか?

    3. データベースプロセスを高速化するにはどうすればよいですか?

    4. キーによって重複しているが、すべての列で重複していない行を見つける方法は?