title: 手动Rank求排名
date: 2019-09-27 12:52:07
tags:
- mySql
- leetCode
分数排名
题目:编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”(中等难度)
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
长话短说,myql是没有rank()函数的,只有自己手动实现,效率最高的方式就是连接差查询,其他什么的循环比较读取,笛卡尔积大的吓人。
知识点:
sql语句中,使用@来定义一个变量。如:@abc
sql语句中,使用:=来给变量赋值,:@abc:=123,则变量abc的值为123
sql语句中,if(A,B,C)表示,如果A条件成立,那么执行B,否则执行C,如:
@abc := if(2>1,100,200)的结果是,abc的值为100。
◎case…when…then语句
case…when…then语句有两种情况:
case情况一(CASE 后面不带表达式):
CASE WHEN expression THEN 操作1
WHEN expression THEN 操作2
…
ELSE 操作n
END
注:自上而下,凡是走了其中一个when或者是走了else了,其他的都不再走了。
case情况二(CASE 后面带表达式,此时WHEN 后面的则是该表达式可能的值):
CASE expression
WHEN expression的值1 THEN 操作1
WHEN expression的值2 THEN 操作2
…
ELSE 操作n
END
注:自上而下,凡是走了其中一个when或者是走了else了,其他的都不再走了。
接本体只需要自己开一列就可以了。
解决思路:
先按照分数排名,去重,添加一列记录分数去重后的排名。即为A表,然后原表记为b表。a left join b on 分数。order by 分数 。
SELECT a.Score, p.Rank
FROM Scores a
LEFT OUTER JOIN
(
SELECT s.Score , @num:=@num+1 AS Rank
FROM (SELECT DISTINCT Score FROM Scores ORDER
BY Score DESC) s, (SELECT @num:=0) r ) AS p
ON a.Score = p.Score
ORDER BY a.Score DESC