我的数据如下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
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
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是这意思吗
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
已写入 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排序,呵
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
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表示的数目超出了分组的范围时返回的值。