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