oracle row_number over

1.先创建表
create   table  employee (empid  int  ,deptid  int  ,salary  decimal ( 10 , 2 ));

2.插入记录
insert   into  employee  values ( 1 , 10 , 5500.00 );
insert   into  employee  values ( 2 , 10 , 4500.00 );
insert   into  employee  values ( 3 , 20 , 1900.00 );
insert   into  employee  values ( 4 , 20 , 4800.00 );
insert   into  employee  values ( 5 , 40 , 6500.00 );
insert   into  employee  values ( 6 , 40 , 14500.00 );
insert   into  employee  values ( 7 , 40 , 44500.00 );
insert   into  employee  values ( 8 , 50 , 6500.00 );
insert   into  employee  values ( 9 , 50 , 750 0.00 );


3.语句讲解
row_number()  over ( [ partition by col1 ]   order   by  col2))  as  别名

此语句表示,根据cole1分组,  在分组内部根据col2进行排序。
而这个别名表示,每个组内排序的顺序编号(组内连接唯一).

4.具体看个例子
SELECT  
       empid,
       deptid,
       salary,
       row_number() 
OVER (PARTITION  BY  deptid  ORDER   BY  salary  DESC ) salary_order 
FROM  employee;
结果如下

延伸一下, 如果是按某个字段分组然后从每组取出最大的一条纪录,只需加一个条件,salary_order=1
sql代码如下:
SELECT  
    t1.empid,
    t1.deptid,
    t1.salary
FROM  (
    
SELECT  
       empid,
       deptid,
       salary,
       row_number() 
OVER (PARTITION  BY  deptid  ORDER   BY  salary  DESC ) salary_order 
    
FROM  employee
    ) t1
WHERE  t1.salary_order = 1 ;

再延伸一下,根据部门分组,再按部门内的个人薪水排序,逐个累加。
SELECT  
    empid,
    deptid,
    salary,
    
sum (salary)  OVER (PARTITION  BY  deptid  ORDER   BY  salary  DESC ) ts   
FROM  employee

5.partition by 与 group by 的区别
   1).partition by能得到统计后的明细数据, group by 只能得到汇总数据。
   2).partition by在from前, group 在 where 后.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值