【面试题】编写一个 SQL 查询来实现分数排名 [ 2.0 版本 ]
编写一个 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 |
+-------+------+
重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 Rank
最佳答案
-
-- 创建表
CREATE TABLE `test1` ( `id` int(11) DEFAULT NULL, `score` double(3,2) DEFAULT NULL COMMENT '分值' ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 插入数据
INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('1', '3.50'); INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('2', '3.65'); INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('3', '4.00'); INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('4', '3.85'); INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('5', '4.00'); INSERT INTO `mysql`.`test1` (`id`, `score`) VALUES ('6', '3.65');
-- 执行查询
set @r=0; SELECT t2.score,t3.rank from `test1` t2 LEFT JOIN ( SELECT (@r:=@r+1) rank,t1.score FROM ( SELECT score FROM `test1` GROUP BY score ORDER by score desc ) t1) t3 on t2.score=t3.score ORDER BY t2.score desc;
其他 2 个回答
PHP学院的中学生
注册时间:2018-10-23
最后登录:2024-09-23
在线时长:168小时13分
最后登录:2024-09-23
在线时长:168小时13分
- 粉丝29
- 金钱4725
- 威望30
- 积分6705