首页 > 试题广场 >

试卷完成数同比2020年的增长率及排名变化

[编程题]试卷完成数同比2020年的增长率及排名变化
  • 热度指数:63828 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):


试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

请计算2021年上半年各类试卷的做完次数相比2020年上半年同期的增长率(百分比格式,保留1位小数),以及做完次数排名变化,按增长率和21年排名降序输出。
由示例数据结果输出如下:


解释:2020年上半年有3个tag有作答完成的记录,分别是C++、SQL、PYTHON,它们被做完的次数分别是3、3、2,做完次数排名为1、1(并列)、3
2021年上半年有2个tag有作答完成的记录,分别是算法、SQL,它们被做完的次数分别是3、2,做完次数排名为1、2;具体如下:

因此能输出同比结果的tag只有SQL,从2020到2021年,做完次数3=>2,减少33.3%(保留1位小数);排名1=>2,后退1名。
示例1

输入

drop table if exists examination_info,exam_record;
CREATE TABLE examination_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    exam_id int UNIQUE NOT NULL COMMENT '试卷ID',
    tag varchar(32) COMMENT '类别标签',
    difficulty varchar(8) COMMENT '难度',
    duration int NOT NULL COMMENT '时长',
    release_time datetime COMMENT '发布时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE exam_record (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int NOT NULL COMMENT '用户ID',
    exam_id int NOT NULL COMMENT '试卷ID',
    start_time datetime NOT NULL COMMENT '开始时间',
    submit_time datetime COMMENT '提交时间',
    score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO examination_info(exam_id,tag,difficulty,duration,release_time) VALUES
  (9001, 'SQL', 'hard', 60, '2020-01-01 10:00:00'),
  (9002, 'C++', 'hard', 80, '2020-01-01 10:00:00'),
  (9003, '算法', 'hard', 80, '2020-01-01 10:00:00'),
  (9004, 'PYTHON', 'medium', 70, '2020-01-01 10:00:00');
	
INSERT INTO exam_record(uid,exam_id,start_time,submit_time,score) VALUES
(1001, 9001, '2020-08-02 10:01:01', '2020-08-02 10:31:01', 89),
(1002, 9001, '2020-04-01 18:01:01', '2020-04-01 18:59:02', 90),
(1001, 9001, '2020-04-01 09:01:01', '2020-04-01 09:21:59', 80),
(1002, 9003, '2021-01-20 10:01:01', '2021-01-20 10:10:01', 81),
(1002, 9001, '2021-03-02 19:01:01', '2021-03-02 19:32:00', 20),
(1001, 9003, '2021-04-02 19:01:01', '2021-04-02 19:40:01', 89),
(1004, 9004, '2020-05-02 12:01:01', '2020-05-02 12:20:01', 99),
(1003, 9001, '2021-05-02 12:01:01', '2021-05-02 12:31:01', 98),
(1001, 9002, '2020-02-02 12:01:01', '2020-02-02 12:20:01', 99),
(1002, 9002, '2020-02-02 12:01:01', '2020-02-02 12:43:01', 81),
(1001, 9002, '2020-01-02 19:01:01', '2020-01-02 19:59:01', 69),
(1001, 9004, '2021-09-02 12:11:01', null, null),
(1003, 9001, '2020-01-02 10:01:01', '2020-01-02 10:31:01', 89),
(1002, 9004, '2020-01-01 12:11:01', '2020-01-01 12:31:01', 83),
(1002, 9003, '2021-01-01 18:01:01', '2021-01-01 18:59:02', 90),
(1002, 9002, '2020-02-02 12:01:01', null, null),
(1002, 9002, '2020-03-02 12:11:01', null, null),
(1001, 9002, '2021-05-05 18:01:01', null, null);

输出

SQL|3|2|-33.3%|1|2|1
头像 BLAcKSQAoO
发表于 2021-11-29 18:34:56
这题逻辑不难,只是需要多层嵌套,参考以下流程: 找到所有tag在2020,2021上半年的完成数 计算growth_rate,并生成各tag完成数排名 取出所有需要的字段,并计算排名变化(2021-2020年,无需取绝对值) 筛选出2020和2021年均有完成记录的tag,并按题目要求排序 运行 展开全文
头像 盐咸咸
发表于 2022-02-28 14:44:19
一、知识点总结与拓展 1)对同一列数据进行加减操作 情况1可排序时:先排序并错位LEAD()OVER() 直接根据条件进行加减筛选SUM(IF(真,1,0))或者 SUM(CASE WHEN ... THEN...END),并使用聚合函 展开全文
头像 风雪行
发表于 2021-11-23 17:31:22
比较直接的思路, 先找出2020年上半年的完成数及排名, 然后找出2021年的完成数及排名, 最后链接两表进行计算即可 select aa.tag, t1.exam_cnt_20, t2.exam_cnt_21, concat(round((t2.exam_cnt 展开全文
头像 offer叉车
发表于 2022-03-27 16:54:46
问题拆分 1.找到各类试卷tag在2020年与2021年上半年的完成次数 试卷完成信息出现在exam_record表中,试卷类别出现在examination_info中,因此通过right join或者left join两表形成表t1; .... exam_record t1 展开全文
头像 不会打篮球的练习生
发表于 2022-07-23 11:53:52
SELECT  tag,          exam_cnt_20,          exam_c 展开全文
头像 摸鱼学大师
发表于 2021-10-24 14:12:17
SQL32 试卷完成数同比2020年的增长率及排名变化 题目主要信息: 计算2021年上半年各类试卷的做完次数相比2020年的增长率(百分比格式,保留1位小数),以及做完次数排名变化,按增长率和21年排名降序输出 试卷信息表examination_info(exam_id试卷ID, tag试卷类别 展开全文
头像 喝养乐多快乐多多
发表于 2023-02-17 10:42:21
这是我第一次写解题思路,除了方便自己复习以为,希望能够大家一些思路。如有不对的地方,欢迎大家指出了~这个题要求计算出2021年试卷完成数同比2020年的增长率和排名变化。计算增长率或者排名变化的前提是知道各年各类试卷的完成情况,所以要先计算出各个上半年各类试卷的完成情况,后续所有计算都是基于此部分。 展开全文
头像 webary
发表于 2021-11-20 17:45:57
明确题意: 2021年上半年各类试卷的做完次数相比2020年同期的增长率(百分比格式,保留1位小数),以及做完次数排名变化; 按增长率和21年排名降序输出。 问题分解: 统计每类试卷2020~2021各年上半年完成数及排名拼接到一行的结果,生成子表 t_exam_complete_20_21_l 展开全文
头像 玉树叶
发表于 2021-11-29 11:22:14
通过代码 SELECT t20.tag, t20.exam_cnt exam_cnt_20, t21.exam_cnt exam_cnt_21, concat(round((t21.exam_cnt - t20.exam_cnt)*100/t20.exam_cnt,1 展开全文
头像 呱呱呱zzz
发表于 2022-05-06 11:11:48
1.2021年上半年做完次数,排名 2.2020年上半年做完次数,排名 3.对比增长率,排名变化 with t1 as( select exam_id,count()cnt1, rank() over(order by count() desc) rank1 from exam_record whe 展开全文