首页 > 试题广场 >

考试分数(三)

[编程题]考试分数(三)
  • 热度指数:126538 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客每次举办企业笔试的时候,企业一般都会有不同的语言岗位,比如C++工程师,JAVA工程师,Python工程师,每个用户笔试完有不同的分数,现在有一个分数(grade)表简化如下:
id language_id score
1 1 12000
2 1 13000
3 2 11000
4 2 10000
5 3 11000
6 1 11000
7 2 11000
第1行表示用户id为1的选择了language_id为1岗位的最后考试完的分数为12000,
....
第7行表示用户id为7的选择了language_id为2岗位的最后考试完的分数为11000,

不同的语言岗位(language)表简化如下:
id name
1 C++
2 JAVA
3 Python

请你找出每个岗位分数排名前2名的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序,得到结果如下:
id name score
2 C++
13000
1 C++
12000
3 JAVA
11000
7 JAVA
11000
4 JAVA
10000
5 Python
11000
示例1

输入

drop table if exists grade;
drop table if exists language;
CREATE TABLE `grade` (
`id` int(4) NOT NULL,
`language_id` int(4) NOT NULL,
`score` int(4) NOT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `language` (
`id` int(4) NOT NULL,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO grade VALUES
(1,1,12000),
(2,1,13000),
(3,2,11000),
(4,2,10000),
(5,3,11000),
(6,1,11000),
(7,2,11000);

INSERT INTO language VALUES
(1,'C++'),
(2,'JAVA'),
(3,'Python');

输出

2|C++|13000
1|C++|12000
3|JAVA|11000
7|JAVA|11000
4|JAVA|10000
5|Python|11000
头像 SunburstRun
发表于 2020-08-17 17:03:53
首先先写出应该筛选的语句,并且把2个表联立起来: select g1.id, l.name, g1.score from grade g1 join language l on g1.langua 展开全文
头像 高质量搬砖人
发表于 2021-02-01 12:38:44
方法) 先按照language的name升序排序 再按照积分降序排序 最后按照grade的id升序排序 SELECT a.id, l.name, a.score FROM language AS l JOIN (SELECT id, language_id, score, dense_rank( 展开全文
头像 qstalking
发表于 2021-01-26 14:29:44
#从输出结果来看,需考虑并列第一的情况,并且依然存在第二名。确定排序函数为dense_rank #整体思路: #1.创建一个中间表,包含需要输出的除了name以外的字段以及分数的组内排名; #2.关联语言表查语言名称 #3.用where筛出组内排名等于1或2的记录 #4.各种排序。 sele 展开全文
头像 109号
发表于 2020-12-07 10:56:22
两种方法: 使用窗口函数计算排名,再筛选排名前2的用户 使用自联结和count函数计算排名,再筛选排名前2的用户 使用窗口函数dense_rank(),将language_id作为排序的“窗口”,按照得分降序排列 SELECT a.id,name,score FROM ( SELECT 展开全文
头像 Khan201803011945114
发表于 2021-09-26 19:43:44
本题使用窗口函数会很方便思路如下:1.首先利用窗口函数获取每一种语言下的成绩排名(注:这里要用dense_rank而不是rankps:dense_rank与rank()用法相当,但是有一个区别:dense_rank在处理相同的等级时,等级的数值不会跳过。rank则跳过。 比如rank是 1224 d 展开全文
头像 湮灭丶星空
发表于 2021-04-17 23:00:39
核心思路: 将当前表分数跟一个临时表进行比较,当临时表没有一个分数,或者只有一个分数比当前表高时,说明该分数排名是第一名,或者第二名。举例:只看C++语言,id为1时,12000<13000,说明这是第二名,id为2时,13000统计出来为0个,没人比他小,说明他是第一名,id为6时,可以知道 展开全文
头像 牛客30426190号
发表于 2023-10-07 21:48:09
SELECT id, name, score FROM ( SELECT g.id AS id, l.name AS name, g.score AS score, DENSE_RANK() OVER(PARTITION BY l.name ORDE 展开全文
头像 牛萍萍
发表于 2021-09-17 17:03:59
select t.id, t.name, t.score from (select g.id, l.name, g.score, dense_rank() over(partition by language_id order by score desc) as rank_1 from grade 展开全文
头像 jiang_dr
发表于 2021-11-11 10:27:08
思路:本题主要的问题就是如何求出每个岗位分数排名前2名的用户 首先我们先写出应该筛选的语句,并联立两个表 select g1.id, l.name, g1.score from grade g1 join language l on g1.language_id = l.id 一般来说,一个 展开全文
头像 想到就去做
发表于 2021-09-09 17:59:41
select id,name,scorefrom (select g.id,name,score, dense_rank()over(partition by language_id order by score desc) rk from grade g left join l 展开全文