MySQL排名处理(分并列和非并列的情况)

前言

在开发过程中,总是会遇到要对数据进行排名的情况,下面我介绍两种开发过程中排名的方式。
方式一:使用变量的方式。
方式二:使用函数rank的方式

数据准备

在数据库中创建一张user表,表中有成绩字段。表创建好后想数据库中添加一些数据。

现在数据库中有如下数据
在这里插入图片描述

方式一:变量的方式

情况一:不管分数相不相同,都按顺序排名(1、2、3、4、5)

SELECT
	a.username,
	a.gender,
	a.achievement,
	@rownum := @rownum + 1 AS ranking 
FROM
	( SELECT a1.username, a1.gender, a1.achievement FROM `user` a1 ORDER BY a1.achievement desc ) a,
	( SELECT @rownum := 0 ) b

运行查询后的结果如下:
可以看到排名按顺序排名,但是有些分数相同的同学,排名却不一样,所以如果要实现并列排名,则使用下面情况二的写法
在这里插入图片描述

情况二:分数相同则并列排名

SELECT
	a.username,
	a.gender,
	a.achievement,
CASE
		
		WHEN @rowtotal = a.achievement THEN
		@rownum 
		
		WHEN @rowtotal := a.achievement THEN
		@rownum := @rownum + 1 
		
		WHEN @rowtotal = 0 THEN
		@rownum := @rownum + 1 
		
	END 'ranking' 
FROM
	( SELECT a1.username, a1.gender, a1.achievement FROM `user` a1 ORDER BY a1.achievement DESC ) AS a,
	( SELECT @rownum := 0, @rowtotal := NULL ) b

运行后结果如下图所示

在这里插入图片描述
情况二这时候就新增加一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名不变,不同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较。

情况三:只要成绩相同排名就相同,但是要占一个位

需要再增加一个变量,来记录排序的号码(自增)

SELECT
	b.username,
	b.gender,
	b.achievement,
	b.ranking 
FROM
	(
	SELECT
		a.username,
		a.gender,
		a.achievement,
		@rownum := @rownum + 1 AS num_tmp,
		@incrnum :=
	CASE
			
			WHEN @rowtotal = a.achievement THEN
			@incrnum 
			
			WHEN @rowtotal := a.achievement THEN
			@rownum 
			
		END  'ranking'
	FROM
		( SELECT a1.username, a1.gender, a1.achievement FROM `user` a1 ORDER BY a1.achievement DESC ) AS a,
		( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) b 
	) AS b

运行结果如下图所示:

在这里插入图片描述

方式二:使用rank函数的方式

情况一:不分组连续排名 ROW_NUMBER()

SELECT
	a.*,
	ROW_NUMBER() over ( ORDER BY a.achievement DESC ) ranking 
FROM
	`user` a;

在这里插入图片描述

情况二:并列跳跃排名 RANK()

	SELECT
	a.*,
	RANK() over ( ORDER BY a.achievement DESC ) ranking 
FROM
	`user` a

在这里插入图片描述

情况三:并列连续排名 DENSE_RANK()

SELECT
	a.*,
	DENSE_RANK() over ( ORDER BY a.achievement DESC ) ranking 
FROM
	`user` a;

在这里插入图片描述

分组排名的情况 (分组即在原来不分组的基础上加上PARTITION BY 分组字段)

以性别进行分组,然后排序,

情况一:分组连续排名 ROW_NUMBER()

在这里插入图片描述

情况二:分组并列跳跃排名 RANK()

在这里插入图片描述

情况二:分组并列连续排名 DENSE_RANK()

在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值