全局排序名次和分组后排序名次 以及 取全局前N名和局部前N名类型--MySQL总结

本文探讨数据库中全局和局部排序的实现,包括row_number(), rank(), dense_rank()窗口函数的应用,以及自连接查询策略。同时讲解了同值不同名、同值同名不跳跃和同值同名要跳跃三种排名情况,并展示了如何在分组后获取局部名次。此外,还介绍了如何选取全局和局部的前N名信息,提供了不同的SQL实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序的名次分为三种,同值不同名;同值同名不跳跃;同值同名要跳跃;

一、显示全局排序名次

实现语句可以借助窗口函数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 即可

 

补充:还有通过自定义的方式解决问题

https://www.cnblogs.com/niniya/p/9046449.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值