表TAB1(PK:COL1)COL1  COL2
------------
1      A
2      A
3      B
4      B
6      B
5      B
9      B
10     C
11     C转化为:
表TAB2(PK:COLA)
COLA  COLB   COLC
--------------------
1      2     A
3      6     B
9      9     B
10     11    C说明:TAB1中COL1是一个顺序值,但可能不连续,也可能顺序乱了,要求转换到TAB2,其中COLA的意思是顺序开始值,COLB的意思是顺序结束值,转化的规则要求将TAB1一条条的记录分段放入TAB2,即TAB1中COL1先排升序后,若COL1中断不连续或者COL2值发生变化时在转入TAB2时另起一行。如果是用后台过程我知道转换,现在想请教用SQL通过分组行不行?另外表TAB1里数据有400万来条,用后台过程处理速度快还是用SQL?

解决方案 »

  1.   

    重要补充!!!!!!!不知道大家能看懂我的意思不?急盼啊,想了快一天了......表TAB1(PK:COL1)
    COL1  COL2
    ------------
    1      A
    2      A
    3      B
    4      B
    6      B
    5      B
    9      B
    10     C
    11     C
    12     B
    13     B
    14     B
    转化为:
    表TAB2(PK:COLA)
    COLA  COLB   COLC
    --------------------
    1      2     A
    3      6     B
    9      9     B
    10     11    C
    12     14    B
      

  2.   

    SQL> desc test
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER
     NAME                                               VARCHAR2(10)SQL> select * from test
      2  ;        ID NAME
    ---------- ----------
             1 A
             2 A
             3 B
             4 B
             6 B
             5 B
             9 B
            10 C
            11 C
            12 B
            13 B        ID NAME
    ---------- ----------
            14 B12 rows selected.SQL> select min(id),max(id),name
      2  from   (select name,id,id-rownum newid
      3          from   (select id,name from test order by name,id))
      4  group by name,newid
      5  /   MIN(ID)    MAX(ID) NAME
    ---------- ---------- ----------
             1          2 A
            12         14 B
             3          6 B
             9          9 B
            10         11 C
      

  3.   

    或者
    select min(id),max(id),name
    from   (select id,
                   name,
                   id-row_number() over (partition by name order by name,id) newid
            from   test)
    group by name,newid
    /   MIN(ID)    MAX(ID) NAME
    ---------- ---------- ----------
             1          2 A
            10         11 C
             9          9 B
            12         14 B
             3          6 B
      

  4.   

    你有没有考虑过ID和NAME一样的情况,如下有两个14,BSQL> select * from test;        ID NAME
    ---------- ----------
             1 A
             2 A
             3 B
             4 B
             6 B
             5 B
             9 B
            10 C
            11 C
            12 B
            13 B        ID NAME
    ---------- ----------
            14 B
            14 B13 rows selected.
    select min(id),max(id),name
    from   (select id,
                   name,
                   id-row_number() over (partition by name order by name,id) newid,
                   row_number()  over (partition by name,id order by id) rn
            from   test)
    where  rn=1
    group  by name,newid
    /   MIN(ID)    MAX(ID) NAME
    ---------- ---------- ----------
             1          2 A
            10         11 C
             9          9 B
            12         14 B
             3          6 B
      

  5.   

    如果你的表和索引分析过了
    NAME和ID是一个复合索引,且分析过了
    就算是几百万,也是比较快的
    当然如果是分页查询,可能不尽人意了很多因素影响着性能,机器硬件页很有关系