首页 > 数据库 > Oracle > 分析函数rank() row_number
很早之前就听网友谈过oracle的分析函数的好处,这两天有些需求不然不觉中用到了分析函数。
分析函数和聚合函数根本不同之处在于聚合函数sum average max min count等只能返回一行,而分析函数可以按组返回多行。
开窗函数的理解:也就是over(partition by class order by s),开窗函数指定了分析函数工作的窗口大小。(具体开窗函数中一些幅度值限制可以参考tom的export one-on-one)
create table student(name varchar2(10),class number,s number)
然后插入一些数据,例如此时student表中的数据:
select * from student
name class s
as 1 94
sd 2 78
fg 1 95
rtgh 3 88
df 2 90
vb 3 89
tyu 3 95
此时如果需要按班级分组分别按成绩排名,如果不用分析函数个人真还不知道有什么办法。
Select name,class,s,rank()over(partition by class order by s desc) mingci from student
Mingci
fg 1 95 1
as 1 94 2
df 2 90 1
sd 2 78 2
tyu 3 95 1
vb 3 89 2
rtgh 3 88 3
当时想了半天的需求一个分析函数就ok了。而且性能上比一般的嵌套sql性能高。
其实刚接触时对于后面的rank()over(partition by class order by s desc) mingci不是很理解,发其实也就是对查询的结果按照分析要求赋值mingci,从1开始递增排名。
Dense_ranke()函数和rank函数基本一样,一点不同是:Rank是跳跃式的,dense_rank没有跳跃。
如果只想查处每班成绩第二名的学生信息
Select * from (select name,class,s,rank()over(partition by class order by s desc) mingci from student) where mingci=2
分析函数中可以加partition by column_name具体某列来分组,去掉partition by column_name后会不分组全部排名。
Row_number()函数返回数据行的信息,并没有排名。
其实也不好表达,直接来sql吧直观。
Select name,class,s from (select name,class,s,row_number()over(partition by class order by s) id from student) where id<=2
fg 1 95
as 1 94
df 2 90
sd 2 78
tyu 3 95
vb 3 89
rank排名显示,row_number返回数据行信息,如果上面的name,class,s改为* ,也会显示嵌套表中的ID。(感觉和rank差不多啊。)
简单的分享了分析函数用法,当然只是很小的一部分。晚了 睡觉了!
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055251/ ,如需转载,请注明出处,否则将追究法律责任。