关于oracle分析函数总结(附加一个行转列的例子)

oracle分析函数是对分组后的数据进行排序

这里用emp表和dept表做例子。

题目:求每个部门工资在前四名的员工信息

有三种情况:

1.用rank(),排名不连续,跳跃性。

select * from(      
   select e.*,
          rank() over (partition by e.deptno order by e.sal desc) drank 
          from emp e) where drank<=3

 数据结果:


 

2.使用dense_rank(),排名连续

   select * from(      
   select e.*,
          dense_rank() over (partition by e.deptno order by e.sal desc) drank 
          from emp e) where drank<=4

 数据结果

 

 

3.使用 row_number()。排名相同则按员工编号升序。连续。

   select * from(      
   select e.*,
          row_number() over (partition by e.deptno order by e.sal desc,e.empno asc) drank 
          from emp e) where drank<=4

 数据结果


 

 

总结,sql server也有这样的函数。

插一句:行转列参考:[url]http://www.iteye.com/topic/1112111[/url]

下面给出一个通用的写法,不用数据库自己提供的函数。不过没有分析函数这么方便

 

select * from 表名 a where (select count(1) from 表名 where 分组字段=a.分组字段   
and 排序字段>=a.排序字段)<=每组前几名 order by 分组字段 ,
排序字段desc



select * from(
select deptno,sal
,(select count(*) from emp where deptno=e.deptno and sal>=e.sal) rk
from emp e
order by deptno,sal desc) where rk<=5;


--一个行转列的例子,使用decode函数
如
student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
……
转换为 
语文 数学 英语
student1 80 70 60
student2 90 80 100

--sql语句
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值