• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
haipali
博客园    首页    新随笔    联系   管理    订阅  订阅

MYSQL -- 分数排名

原题:

  1. 分数排名

中等

1.1K

相关企业
SQL Schema
表: Scores

+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| score | decimal |
+-------------+---------+
Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。

编写 SQL 查询对分数进行排序。排名按以下规则计算:

分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。

查询结果格式如下所示。

示例 1:

输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+

解析:

  1. 将同一张表引两次,第一张表根据score成绩降序排序,第二张表与第一张表进行比较,COUNT出去重后,大于等于第一张表score的数量,即为该成绩的排名rank
    上代码
SELECT s1.score,COUNT(DISTINCT s2.score) as 'rank'
FROM Scores s1,Scores s2
WHERE s1.score<=s2.score
GROUP BY s1.id
ORDER BY s1.score DESC
  1. MYSQL8.0之后更新了序号函数,该题可直接使用该函数解答
    代码:
SELECT Score ,DENSE_RANK() OVER(ORDER BY Score DESC) as 'rank'
FROM Scores

一步搞定,封装过就是舒服
学习地址: MySQL窗口函教-序号函数(row_number、rank、dense_rank)

posted @ 2023-03-16 15:26  蓝光水母  阅读(265)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3