一张表A结构如下:
  number              addr       city
  2100001             北京       北京
  2100002             北京       北京
  2100003             河北       石家庄  
  2100004             河北       石家庄
  2100005             河北       石家庄
  2100017             河北       唐山 
  2100018             湖南       长沙     
  2100019             河北       唐山
  2100020             河北       唐山
  2100021             河北       唐山
     .                  .          . 
     .                  .          .
     .                  .          .   
     .                  .          . 
现在要把A表的数据插到B表如下:
  begin        end        provi     city
  2100001      2100002    北京      北京 
  2100003      2100005    河北      石家庄
  2100017      2100017    河北      唐山
  2100018      2100018    湖南      长沙
  2100019      2100021    河北      唐山
    .            .         .          .
    .            .         .          . 我的积分不多,没有多少给大虾。。就当高手练练手呀!!!    

解决方案 »

  1.   

    insert into b (select min(number),max(number),addr,city from a group by addr,city)
      

  2.   

    1楼脚本得出的结果是:
    begin           end           provi      city 
    2100001         2100002       北京         北京   
    2100003         2100005       河北         石家庄 
    2100017         2100021       河北         唐山 
    2100018         2100018       湖南         长沙 
    以下代码可以实现楼主需求:SELECT MIN(number) begin, MAX(number) end, addr provi, city
    FROM

      select 
        number, 
        addr,
        city,
        SUM(IsFirst) OVER (ORDER BY number) RANK_INDEX  --累加,得出分组
      from
      ( --按照number的顺序,判断本行与上一行是否相同,从而得出首行标识
        SELECT 
          number, 
          addr,
          city,
          DECODE(addr||'-'||city, LAG(addr||'-'||city, 1, 0) OVER (ORDER BY number), 0, 1) IsFirst
        FROM a 
      )
    )
    GROUP BY RANK_INDEX, addr, city
      

  3.   

    wffffc,他要的不是单纯的累积,只有用lag或者lead函数,才可以做到它的要求。
      

  4.   


    SQL> select * from table1;       NUM ADDR       CITY
    ---------- ---------- ----------
       2100001 北京       北京
       2100002 北京       北京
       2100003 河北       石家庄
       2100004 河北       石家庄
       2100005 河北       石家庄
       2100017 河北       唐山
       2100018 湖南       长沙
       2100019 河北       唐山
       2100020 河北       唐山
       2100021 河北       唐山已选择10行。select min(num) begin,max(num) end,addr,city from(
      select num,addr,city,rn, rn-rank() over (partition by addr,city order by rn) rn1 
      from ( select num,addr,city,rownum rn from table1)
    )group by addr,city,rn1;     BEGIN        END ADDR       CITY
    ---------- ---------- ---------- ----------
       2100001    2100002 北京       北京
       2100017    2100017 河北       唐山
       2100019    2100021 河北       唐山
       2100003    2100005 河北       石家庄
       2100018    2100018 湖南       长沙
      

  5.   

    如果要求顺序也要和LZ一样的话就在结尾加上 order by max(rn);select min(num) begin,max(num) end,addr,city from(
      select num,addr,city,rn, rn-rank() over (partition by addr,city order by rn) rn1 
      from ( select num,addr,city,rownum rn from table1)
    )group by addr,city,rn1 order by max(rn);
         BEGIN        END ADDR       CITY
    ---------- ---------- ---------- ----------
       2100001    2100002 北京       北京
       2100003    2100005 河北       石家庄
       2100017    2100017 河北       唐山
       2100018    2100018 湖南       长沙
       2100019    2100021 河北       唐山
      

  6.   

    select num,addr,city,rownum rn from table1--存在顺序问题,需要ORDER BY number
      

  7.   

    sulins的代码在PL/SQL Developer 的sql窗口测试很好用呀。。 谢啦!!!
    只是放到过程里面的话,在编译时通过了,可在测试时却不执行不知为什么。。
      注:我新来的,怎么才能给回到问题者加分???? 急!!!!
      

  8.   

    79bo(山芋)的执行完后比sulins(晓林)的代码执行结果多了244行数据。
      

  9.   

    “结贴”时给分。
    你反映说在存储过程中不能执行,因为你没有贴出代码,我只能猜测了。
    存储过程不能执行select查询语句(“select 字段 into 变量 from 表名” 是可以的),你改成insert into b select ……。