1. 程式人生 > >編寫sql實現分數排名 mysql

編寫sql實現分數排名 mysql

編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
1
2
3
4
5
6
7
8
9
10
例如,根據上述給定的 Scores 表,你的查詢應該返回(按分數從高到低排列):

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+
1
2
3
4
5
6
7
8
9
10
引用大佬的建表語句,方便測試自己的猜想:

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');  
1
2
3
4
5
6
7
8
查詢去重後分數的,條件:當前行分數大於等於同表的分數的count數量,去重顯示,然後降序輸出

# 方法一:
# select Score, (select count(distinct Score) from Scores where Score>=s.Score) as Rank from Scores as s order by Score desc;  
1
2
首先查詢去重後的分數作為新表,使用count統計行,條件:當前去重表後的分數>=未去重的分數作為Rank的引數,然後使用排序降序輸出

# 方法二:
select Score,(select count(*) from (select distinct Score as s from Scores) as new_scores where s >= Score) Rank from Scores order by Score
-