2021-04-13 14:06:29 392次浏览 2条回答 1 悬赏 10 金钱

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

sixstar

最佳答案

  • yyf 发布于 2021-04-14 14:31 举报

    -- 创建表

    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;
    
  • 回答于 2021-04-26 18:32 举报

    没看懂题目,也没看懂答案,这两个子查询在做什么呢?

您需要登录后才可以回答。登录 | 立即注册
PHP学院的中学生
总监

PHP学院的中学生

注册时间:2018-10-23
最后登录:1天前
在线时长:82小时7分
  • 粉丝20
  • 金钱2000
  • 威望20
  • 积分3020

热门问题