排序的名次分为三种,同值不同名;同值同名不跳跃;同值同名要跳跃;
一、显示全局排序名次
实现语句可以借助窗口函数row_number(),rank(),dense_rank();
也可以通过自连接查询实现;
1、同值不同名
(说明:通过连接查询去统计比自己值大的个数已经不在准确,但可以通过自定义变量的方法解决)
2、同值同名不跳跃
(说明:由于不需要跳跃,只需要统计比自己大的不同值的个数,然后加上1就是自己的排名;或者也可以统计算上自己在内的不同值个数,即为自己的排名;)
3、同值同名要跳跃
(说明:由于要跳跃,只能统计比当前sal大的所有个数,然后加1就是自己的排名);
二、分组后局部的名次
1、第一种排序方式下的我没有找到好的方式,(太菜了
2、后两种排序中只需要在一中使用的连接语句on后面在添加一个 a.deptno=b.deptno即可;
三、全局取前N名的信息
这个可以直接通过分页查询或者子查询来实现实现
1、无论重复否,只取前n个(这个涵盖了第一种排序方式):
select * from emp order by sal desc limit 0,N;
2、取不重复的n+1个结果的前一个为止,即结果可能多与n个。
在后两种种排序的方式下,只需要分别在模块一中的代码group by 后使用having rnk < N+1 即可
四、局部内取前N名的信息
1、第一种排序方式下的我没有找到好的方式,(太菜了
2、后两种种排序方式下,主要在模块二中的代码group by 后使用having rnk < N+1 即可
补充:还有通过自定义的方式解决问题