因为我在刷LeetCode题目的时候,遇到了这题Rank Scores
题目的要求是对score进行降序排列后并生成序号。它要得到的结果如下:
我的思路是先将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
以上。