mysql 排序后的序号_在MySQL中,排序后添加序号列

因为我在刷LeetCode题目的时候,遇到了这题Rank Scores

2uIRNj.jpg

587929

题目的要求是对score进行降序排列后并生成序号。它要得到的结果如下:

2M7Zfi.jpg

587929

我的思路是先将score去重后进行降序排列,然后再添加序号列,最后将新表与原表利用JOIN联结起来。

1、去重与降序

在MYSQL中,去重要用到DISTINCT语句,而它的排序默认的是升序,我们要的是降序便需要用到DESC。代码如下:

select distinct score

from scores

order by score desc

2、添加序号列

将上面得到的表命名为T1,对其添加序号列。在这里有个疑惑:为什么不在上表中直接添加序号列呢?例如将代码写成:

select distinct score,(@rownum:=@rownum+1) as rownum

from scores,(select @rownum:=0) R

order by score desc

运行结果如下:

score rownum

4.00 3.0

4.00 5.0

3.85 4.0

3.65 2.0

3.65 6.0

3.50 1.0

这时就会发现它没有去重,而且它的序号和原来的ID是一致的。所有说直接添加序号列不可行。因此我们对T1添加序号列,代码如下:

select T1.score as score1,(@rownum:=@rownum+1) as rownum

from

(select distinct score

from scores

order by score desc) as T1,(select @rownum:=0) as R

其结果如下:

score1 rownum

4.00 1.0

3.85 2.0

3.65 3.0

3.50 4.0

3、与Scores表(即原表)联结

到这里,只要对Scores表降序排列,再与步骤2得到的T2表联结就可以了。代码如下:

select score,T2.rownum as Rank

from Scores

join

(select T1.score as score1,(@rownum:=@rownum+1) as rownum

from

(select distinct score

from scores

order by score desc) as T1,(select @rownum:=0) as R) as T2

on Scores.score=T2.score1

order by Scores.score DESC

结果如下:

Score Rank

4.00 1.0

4.00 1.0

3.85 2.0

3.65 3.0

3.65 3.0

3.50 4.0

以上。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值