关于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

 数据结果:


关于oracle分析函数总结(附加一个行转列的例子)_第1张图片

 

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

 数据结果
关于oracle分析函数总结(附加一个行转列的例子)_第2张图片

 

 

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

 数据结果


关于oracle分析函数总结(附加一个行转列的例子)_第3张图片

 

 

总结,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

你可能感兴趣的:(oracle)