java中rank函数_rank()函数的使⽤
排序:
---rank()over(order by 列名 排序)的结果是不连续的,如果有4个⼈,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4
select scoreid, studentid,COURSENAME,totalexamscore ,
rank()over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
---dense_rank()over(order by 列名 排序)的结果是连续的,如果有4个⼈,其中有3个是并列第1名, 那么最后的排序结果如:1 1 1 2
select scoreid, studentid,COURSENAME,totalexamscore ,
dense_rank()over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
----rank () OVER (PARTITION BY 列名 ORDER BY 列名 排序)使⽤分区⽅式获取每门课程的最⾼分
SELECT *
FROM (SELECT scoreid, studentid, coursename, TOTALEXAMSCORE,
rank () OVER (PARTITION BY coursename ORDER BY TOTALEXAMSCORE DESC)orderbynum
FROM scorecourse a, coursescore b
WHERE a.scorecourseid = b.scorecourseid and studentID = 'xxxxx')
WHERE orderbynum < 2
-----使⽤over实现成绩求和
-----SUM (totalexamscore) OVER (ORDER BY studentid) sum1 实现的是连续求和,如第⼀个学⽣的总评成绩是30,则sum1就展⽰为30,到第⼆个学⽣成绩出现的时候,则会依次累加
-----SUM (totalexamscore) OVER () sum2 就相当于是单纯的求和,和直接使⽤sum是⼀致的
SELECT scoreid, studentid, totalexamscore,
SUM (totalexamscore) OVER (ORDER BY studentid) sum1,
SUM (totalexamscore) OVER () sum2
FROM coursescore
注:这个案例想了很久也没想到很直观的描述,还请⼤家亲⾃去测试⼀下吧!!
rank函数的用法语法:
rank() over (order by 排序字段 顺序)
rank() over (partition by 分组字段 order by 排序字段 顺序)
1.顺序:asc|desc 名次与业务相关:
⽰例:求优秀学员,成绩:降序 迟到次数:升序
2.分区字段:根据什么字段进⾏分区。
问题:分区与分组有什么区别?
·分区只是将原始数据进⾏名次排列(记录数不变),
·分组是对原始数据进⾏聚合统计(记录数变少,每组返回⼀条)。
注意:使⽤rank()over(order by 排序字段 顺序)排序的时候,空值是最⼤的
(如果排序字段为null,可能造成在排序时将null字段排在最前⾯,影响排序的正确性。
所以建议将dense_rank()over(order by 列名 排序)改为dense_rank()over(order by 列名 排序 nulls last)这样只要排序字段为null,就会放在最后,⽽不会影响排序结果).
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论