手动Rank求排名


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

发布了11 篇原创文章 · 获赞 1 · 访问量 613

猜你喜欢

转载自blog.csdn.net/Fujie1997/article/details/102303035