oracle——分析函数——排序值分析函数
一、问题描述
查询列表时,我们有时需要对查询结果依据某个字段进行排名。
如果每条记录在排序字段上都不相同,我们可以将原查询作为一个视图,查询其rownum,便可以实现简单排序,例如:
select rownum,e.* from emp e;
但是,很多时候我们想用来排序的字段都是有重复值的,此时可能需要将值相同的记录名词并列,那么我们就需要用到oracle的分析函数了。
二、解决
1.排序字段相同的名次并列,且所有名次连续
select dense_rank() over(order by sal desc) rk,e.ename,e.sal from emp e;
3000元的员工有两个,他们的名词并列,且下一个用户的名词连续计数(区别于2)
2.排序字段相同的名次并列,且下一个名次是跳跃排序的,比如,有两个第二名时,下一个就是第四名
select rank() over(order by sal desc) rk,e.ename,e.sal from emp e;
三、其他
有时,我们需要将不同部门下的员工进行排名,此时,我们需要使用
row_number() over(partition by column1 order by column2)
按照column1分组,然后在组内,按照column2排序。
select row_number() over(partition by e.job order by e.sal) rk,e.job,e.ename,e.sal from emp e;
四、扩展
需求:统计用户签到排名
每个用户每次签到生成一条数据,统计每个用户签到的总次数然后排名,为用户显示签到排名。
1.连续排名,相同次数的用户名次并列
select dense_rank()over(order by cnt desc) RANKING,b.* from ( select count(1) cnt, user_id from MIC_TD_EXERCISE_SIGNIN group by user_id order by cnt DESC) b;
2.不连续排名
select rank() over(order by cnt desc) ranking,b.* from ( select count(1) cnt, user_id from MIC_TD_EXERCISE_SIGNIN group by user_id order by cnt DESC) b;