数据库里数据结构是这样的:    大分类  小分类
    A       NULL
    A       NULL
    A       语文
    A       语文
    A       数学
    A       NULL
    B       自然
    B       自然
    B       自然
    C       NULL
    D       NULL要求:
   得出相邻的相同的数据的个数
   要求结果
    大分类  小分类 个数
    A       NULL    2
    A       NULL    2
    A       语文    2
    A       语文    2
    A       数学    1
    A       NULL    1
    B       自然    3
    B       自然    3
    B       自然    3
    C       NULL    1
    D       NULL    1我记得有函数可以实现,请高手赐教。

解决方案 »

  1.   

    这个必须要有一个排序字段,ORACLE的表默认为堆表,不能依赖自然顺序
      

  2.   

    真的没法做,如果null值统一处理的话,使用左连接:
    select ta.p1,ta.p2,tb.p4
    from ta,
         (select p1,p2,count(p3) p4
          from (
                select p1,p2,decode(p2,null,'1',p2) p3
                from ta)
          group by p1,p2) tb
    where ta.p1=tb.p1(+)
      and ta.p2=tb.p2(+)
    order by p1
      

  3.   

    你这个相邻 必然得有个排序的列吧,还是按照rowid这样排序?
      

  4.   

       排序NO  大分类   小分类
          1       A        NULL
          2       A        NULL
          3       A        语文
          4       A        语文
          5       A        数学
          6       A        NULL
          7       B        自然
          8       B        自然
          9       B        自然
          10      C        NULL
          11      D        NULL排序就是按照排序NO排列的,求之前说的结果
      

  5.   


    SQL> with ta as(
      2       select 1 id,'A' p1,'NULL' p2 from dual union all
      3       select 2,'A','NULL' from dual union all
      4       select 3,'A','语文' from dual union all
      5       select 4,'A','语文' from dual union all
      6       select 5,'A','数学' from dual union all
      7       select 6,'A','NULL' from dual union all
      8       select 7,'B','自然' from dual union all
      9       select 8,'B','自然' from dual union all
     10       select 9,'B','自然' from dual union all
     11       select 10,'C','NULL' from dual union all
     12       select 11,'D','NULL' from dual)
     13  select ta.id,ta.p1,ta.p2,tb.p3
     14  from ta,(
     15  select id,p1,p2,count(decode(p2,null,'1',p2)) over (partition by p1,p2 order by p1,p2) p3
     16  from ta
     17  group by id,p1,p2) tb
     18  where ta.id=tb.id(+)
     19    and ta.p1=tb.p1(+)
     20    and ta.p2=tb.p2(+)
     21  order by id
     22  /
     
            ID P1 P2           P3
    ---------- -- ---- ----------
             1 A  NULL          3
             2 A  NULL          3
             3 A  语文          2
             4 A  语文          2
             5 A  数学          1
             6 A  NULL          3
             7 B  自然          3
             8 B  自然          3
             9 B  自然          3
            10 C  NULL          1
            11 D  NULL          1
     
    11 rows selected
      

  6.   


    select id,p1,p2,
           count(decode(p2,null,'1',p2)) over (partition by p1,p2 order by p1,p2) p3
    from ta
    group by id,p1,p2
    order by id
            ID P1 P2           P3
    ---------- -- ---- ----------
             1 A  NULL          3
             2 A  NULL          3
             3 A  语文          2
             4 A  语文          2
             5 A  数学          1
             6 A  NULL          3
             7 B  自然          3
             8 B  自然          3
             9 B  自然          3
            10 C  NULL          1
            11 D  NULL          1
      

  7.   


    我想要的结果是:1 A  NULL          2
    2 A  NULL          2因为A NULL相邻的只有2个下面不相邻的不能算进去
      

  8.   

    with tab as(
    select 1 id,'A' p1,'NULL' p2 from dual union all
    select 2,'A','NULL' from dual union all
    select 3,'A','语文' from dual union all
    select 4,'A','语文' from dual union all
    select 5,'A','数学' from dual union all
    select 6,'A','NULL' from dual union all
    select 7,'B','自然' from dual union all
    select 8,'B','自然' from dual union all
    select 9,'B','自然' from dual union all
    select 10,'C','NULL' from dual union all
    select 11,'D','NULL' from dual
    )
    select id,p1,p2,count(*)over(partition by p1,p2,id-rn) cnt from(
    select id,p1,p2,row_number()over(partition by p1,p2 order by id) rn from tab
    )
    order by idID P1 P2  CNT
    -----------------
     1 A NULL 2
     2 A NULL 2
     3 A 语文 2
     4 A 语文 2
     5 A 数学 1
     6 A NULL 1
     7 B 自然 3
     8 B 自然 3
     9 B 自然 3
    10 C NULL 1
    11 D NULL 1