Tools
首页
画图
音乐
采集
记事
博客
实验室
登录
lypeng
146
文章
11
分类
46
记事
分类
生活-[23]
Linux-[24]
前端-[9]
数据库-[16]
PHP-[31]
git-[7]
其他-[6]
python-[20]
算法-[4]
React-Native-[4]
中草药-[2]
广告位1
广告位2
首页
/ 数据库
返回列表
LeetCode--178 分数排名
阅读:543
发布:2018-07-18
作者:lypeng
### 178 Rank Scores(中等) 题目:编写一个sql语句来实现分数排名,如果两个分数相同,则两个分数排名(Rank)相同,而且下一个名次应该是下一个连续的整数值,也就是说,名次之间不能有间隔。 | Id | Score | |----|-------| | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | 例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列): | Score | Rank | |-------|------| | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | ### 我的解答 ``` select a.Score,b.Rank from Scores as a, (select @rank:=@rank+1 as rank,Score from (select Score from Scores group by Score order by Score desc) as t1, (select @rank:=0) as t2 ) as b where a.Score=b.Score order by a.Score desc; ``` 看着有点长,对比其他答案可能稍显繁琐,不过也好理解,哈哈~ 上图:  1. 得到每一个分数的排名 2. 把表里面的每一个分数跟排名表去对比,得到这个分数的排名 3. 按分数倒序排列 左上1号图,得到排名的SQL如下: `select @rank:=@rank+1 as rank,Score from (select Score from Scores group by Score order by Score desc) t1,(select @rank:=0) t2` 注:@rank自定义变量,后面必须加@rank:=0设置初始值,否则变量会被记住,下次查询不是1234,变为5678 ### 答案二: 对于每一个分数,从表中找出有多少个大于或等于该分数的不重复分数,然后降序排列 ```sql select Score, (select count(distinct Score) from Scores as s2 where s2.Score >= s1.Score) Rank from Scores as s1 order by Score DESC; ``` ### 答案三: 使用联结 join,条件是左表的分数小于等于右表的分数时,对右表的分数进行计数(即计算有几个不重复的分数大于自己,计算结果就是rank),然后根据id分组后,再根据分数降序排列 ```sql select s1.Score, count(distinct s2.Score) Rank from Scores as s1 join Scores as s2 on s1.Score <= s2.Score group by s1.Id order by s1.Score DESC; ``` 参考:[mysql rank函数实现] https://www.cnblogs.com/bjwylpx/p/5345162.html?_blank 答案二与三来自:https://blog.csdn.net/zz_moon/article/details/80626759?_blank
------本文结束
感谢阅读------
上一篇:
mysql读写分离
下一篇:
mysql函数总结