MySQL实现排名

0x01.需求

编写一个 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    |
+-------+------+

SQL架构:

Create table If Not Exists Scores (Id int, Score DECIMAL(3,2))
Truncate table Scores
insert into Scores (Id, Score) values ('1', '3.5')
insert into Scores (Id, Score) values ('2', '3.65')
insert into Scores (Id, Score) values ('3', '4.0')
insert into Scores (Id, Score) values ('4', '3.85')
insert into Scores (Id, Score) values ('5', '4.0')
insert into Scores (Id, Score) values ('6', '3.65')

0x02.解决需求

排名的思路如下:

  • 首先对表进行倒序排序,作为第一列。

  • 第二列的排名表计算方法如下:

    • 从已排序的表中计算比每个数大的的个数,因为相同的会重复,所以需要去重,去重后比自己大的个数就是它的排名。
    • 例如:99 99 98 ,计算98的排名,只需要计算去重后大于等于98的个数,就是它的排名,计算得出是2。
  • 将两张表组合起来。

SQL语句如下:

SELECT 
    a.Score AS Score,
    (SELECT  COUNT(DISTINCT b.Score) FROM Scores b WHERE b.Score>=a.Score) AS Rank
From 
    Score  a
ORDER BY a.Score DESC;

ATFWUS --Writing By 2020–03–29

发布了162 篇原创文章 · 获赞 182 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/105183572