編寫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
-