我的数据如下no        code  qty  lineno  xuhao 
09050101  aaa    1      1     1
09050101  bbb    1      2     2
09050101  aaa    4      3     3
09050102  aaa    1      1     4
09050102  bbb    6      2     5
09050103  ccc    1      1     6
09050103  aaa    2      2     7
09050103  ccc    3      3     8    如何合并成为新的数据表,其中code根据相同no进行合并,同时lineno ,xuhao自动更改
no        code  qty  lineno  xuhao 
09050101  aaa    5      1     1
09050101  bbb    1      2     2
09050102  aaa    1      1     3
09050102  bbb    6      2     4
09050103  ccc    1      1     5
09050103  aaa    4      2     6  

解决方案 »

  1.   


    SQL> ed
    已写入 file afiedt.buf  1  select no,code,qty,lineno,rownum xuhao
      2  from
      3  (select no,code,sum(qty) qty,row_number() over(partition by no order by sum(qty) desc) lineno
      4  from test_07
      5  group by no,code
      6  )
      7* order by no
    SQL> /NO                   CODE              QTY     LINENO      XUHAO
    -------------------- ---------- ---------- ---------- ----------
    09050101             aaa                 5          1          1
    09050101             bbb                 1          2          2
    09050102             bbb                 6          1          3
    09050102             aaa                 1          2          4
    09050103             ccc                 4          1          5
    09050103             aaa                 2          2          6是这意思吗
      

  2.   

    try:select no,
           code,
           sum(qty) qty,
           row_number() over(partition by no order by code) lineno,
           row_number() over(order by no, code) xuhao
      from t
     group by no, code
     order by no, code
      

  3.   

    SQL> ed
    已写入 file afiedt.buf  1  select no,code,sum(qty) qty,row_number() over(partition by no order by sum(qty) desc) lineno,
      2   row_number() over(order by no,code) xuhao
      3  from test_07
      4  group by no,code
      5* order by no
      6  /NO                   CODE              QTY     LINENO      XUHAO
    -------------------- ---------- ---------- ---------- ----------
    09050101             aaa                 5          1          1
    09050101             bbb                 1          2          2
    09050102             aaa                 1          2          3
    09050102             bbb                 6          1          4
    09050103             aaa                 2          2          5
    09050103             ccc                 4          1          6xuhao也可以直接用over排序,呵
      

  4.   

    create table tb2(no varchar(20),code varchar(20),qty number, lineno number, xuhao number);
    truncate table tb2;
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050101',  'aaa',    1,      1,    1 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050101',  'bbb' ,   1 ,     2   , 2 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050101',  'aaa',    4 ,     3 ,   3 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050102',  'aaa',    1,      1 ,   4 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050102',  'bbb',    6 ,     2  ,  5 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050103',  'ccc' ,   1 ,     1  ,  6 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050103',  'aaa',    2 ,     2  ,  7 );
    insert into tb2(no,code,qty, lineno, xuhao)values ('09050103',  'ccc',    3  ,    3  ,  8  );
    commit; select no, code, qty, lineno, rownum xuhao
       from (select no,
                    code,
                    sum(qty) qty,
                    row_number() over(partition by no order by code) lineno
               from tb2
              group by no, code
        )
      order by no
      
    NO                  CODE              QTY    LINENO      XUHAO 
    -------------------- ---------- ---------- ---------- ---------- 
    09050101            aaa                5          1          1 
    09050101            bbb                1          2          2 
    09050102            bbb                6          1          3 
    09050102            aaa                1          2          4 
    09050103            ccc                4          1          5 
    09050103            aaa                2          2          6 
      

  5.   


    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 
      与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .  lag(arg1,arg2,arg3): 
    arg1是从其他行返回的表达式 
    arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 
    arg3是在arg2表示的数目超出了分组的范围时返回的值。