LeetCode-178:分数排名

题目描述:

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

SQL架构:

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‘);

解题思路:

  oracle可以使用排名函数进行排名,因为名次之间不应该有“间隔”,所以要使用dense_rank()函数,这个函数排的名次是连续的,rank()函数会跳过(并列排名),mysql依然是使用自定义变量来进行排名。

解题方案:

  oracle

select round(a.score,2) as score, b.rank
  from Scores a
  join (select a.*, rownum as rank
          from (select distinct a.score from Scores a order by a.score desc) a) b
    on a.score = b.score
 order by b.rank

  mysql

SELECT
    ROUND(a.score, 2) AS score,
    b.rank
FROM
    Scores a
JOIN (
    SELECT
        a.*, (@rowNum :=@rowNum + 1) AS rank
    FROM
        (
            SELECT DISTINCT
                a.score
            FROM
                Scores a
        ) a,
        (SELECT(@rowNum := 0)) b
    ORDER BY
        a.score DESC
) b ON a.score = b.score
ORDER BY
    b.rank

原文地址:https://www.cnblogs.com/zouqf/p/10283410.html

时间: 2024-10-11 23:00:02

LeetCode-178:分数排名的相关文章

MYSQL分数排名

编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同.请注意,平分后的下一个名次应该是下一个连续的整数值.换句话说,名次之间不应该有“间隔”. +----+-------+| Id | Score |+----+-------+| 1 | 3.50 || 2 | 3.65 || 3 | 4.00 || 4 | 3.85 || 5 | 4.00 || 6 | 3.65 |+----+-------+例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从

Leetcode 178. Rank Scores (Database)

参考: https://my.oschina.net/Tsybius2014/blog/493244 常见的排序1. 排名1,2,3,...,n 不对重复的分数做特殊处理 Score  Rank 100     1 99     2 99     3 98     4 90     5 # Write your MySQL query statement below select Score, @Counter := @Counter + 1 as rank from Scores, (sele

利用awk处理学生分数排名问题案例

利用awk处理学生分数排名问题真实案例如下: 1.已知老男孩教育运维班26期期中集群架构上台述职报告人员的分数为: 提示:由述职学员上台演讲搭建的集群架构,由学生评委和导师评分,历经2天共产生如下评分 [[email protected] ~]# cat oldboy_student.txt 冯泉    100     100     96      95      100     96      100     97 万永振  100     95      90      88      9

SOJ.分数排名查询

分数排名查询     总提交数量: 641 通过数量: 239                 时间限制:1秒    内存限制:256兆 题目描述 张老师在同学们考试结束后,收到很多邮件. 有的同学问学号为"12号"的多少分? 有的同学问学号为"18号"的排名第几? 有的同学问80分全班排第几? 还有的同学问90分的全班有几个人? 张老师手上有所有同学的分数,请你写一个程序帮他去回答这些问题. 输入格式 输入由两部分组成,第一部分为同学的分数.第一行n为同学的数量(

Django项目:CRM(客户关系管理系统)--75--65PerfectCRM实现CRM课程分数排名

1 # classtop_urls.py 2 # --------64PerfectCRM实现CRM课程排名详情-------- 3 from django.conf.urls import url 4 from bpm.coursetop import coursetop_views 5 urlpatterns = [ 6 url( r'^coursetop_details/(\d+)/$', coursetop_views.coursetop_details, name="coursetop

力扣——分数排名(数据库的题

编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同.请注意,平分后的下一个名次应该是下一个连续的整数值.换句话说,名次之间不应该有"间隔". +----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+ 例如,根据上述给定的 Scores 

分数排名

编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同 +----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+ 例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列): +-------+------+ | Score |

Leetcode 592.分数加减运算

分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1.所以在上述例子中, 2 应该被转换为 2/1. 示例 1: 输入:"-1/2+1/2" 输出: "0/1"  示例 2: 输入:"-1/2+1/2+1/3" 输出: "1/3" 示例 3: 输入:"1/3-1/

sql -leetcode 178. Rank Scores

Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: select Score, (select count(distinct Score) from Scores where Score>=s.Score) Rank where Scores s order by Score desc; 或者: select s.Score ,count(distinct