ITPub博客

首页 > 数据库 > Oracle > 分析函数rank() row_number

分析函数rank() row_number

原创 Oracle 作者:dotaddjj 时间:2011-09-22 00:44:43 0 删除 编辑

很早之前就听网友谈过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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662975