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

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

https://www.nowcoder.com/practice/13415dff75784a57bedb6d195262be7b

这是我第一次写解题思路,除了方便自己复习以为,希望能够大家一些思路。如有不对的地方,欢迎大家指出了~

这个题要求计算出2021年试卷完成数同比2020年的增长率和排名变化。

计算增长率或者排名变化的前提是知道各年各类试卷的完成情况,所以要先计算出各个上半年各类试卷的完成情况,后续所有计算都是基于此部分。

如何筛选出上半年呢?采用的是:date_format(submit_time,'%Y%m') between '202X01' and '202X06'

所以上半年试卷完成数可以采用:case...when...then...else...end的语句,如果在时间范围内,则是计算score的个数,若不是则为空,count()几种用法的区别:

count(1)和count(*)表示计算所有行数,包括null;

count(变量名)不考虑空值;

count(null) = 0;

当count()的括号中有表达式时,赋予null的数据不统计。所以代码如下:

count(case when date_format(submit_time,'%Y%m') between '202101' and '202106' then score end)

各类试卷:就是将表exam_record和examination_info用‘exam_id’连接起来,然后group by tag。

增长率的计算公式为:(2021年上半年试卷完成数-2020年上半年试卷完成数)/2020年上半年试卷完成数

所以,计算出各类的完成情况后,就可以计算出增长率:

ifnull(concat(round((exam_cnt_21-exam_cnt_20)/exam_cnt_20*100,1),'%'),0) as growth_rate

排名变化:因为我们已经计算出了各年各类试卷的完成数,所以可以根据exam_cnt_rank_20和exam_cnt_rank_21的值进行排序。

所采用的排名函数为:rank() over(order by exam_cnt_21 desc) as exam_cnt_rank_21

截至目前,所有要计算的指标都已经计算完毕,但还要计算一个排名变化情况。也就是exam_cnt_rank_21-exam_cnt_rank_20,但是,如果直接计算结果可能不对,因为排名可能会出现负数,所以核心是使用 cast(targetCol as signed) 将所有涉及到的unsigned字段先转化为signed类型后,再进行运算。signed表示这个变量是有符号的,可以存储整数和负数。

最后,筛选出完成试卷的,即完成数非0,再按照growth_rate 和exam_cnt_rank_21降序排列。

select 
*,
CAST(exam_cnt_rank_21 as SIGNED)-CAST(exam_cnt_rank_20 as SIGNED) as rank_delta
from
(
select tag,
exam_cnt_20,exam_cnt_21,
ifnull(concat(round((exam_cnt_21-exam_cnt_20)/exam_cnt_20*100,1),'%'),0) as growth_rate,
rank() over(order by exam_cnt_20 desc) as exam_cnt_rank_20,
rank() over(order by exam_cnt_21 desc) as exam_cnt_rank_21
from
(
select tag,
count(case when date_format(submit_time,'%Y%m') between '202101' and '202106' then score end) as exam_cnt_21,
count(case when date_format(submit_time,'%Y%m') between '202001' and '202006' then score end) as exam_cnt_20
from exam_record
left join examination_info using(exam_id)
group by tag
) t1
) t2
WHERE exam_cnt_20 != 0 AND exam_cnt_21 != 0
order by growth_rate desc,exam_cnt_rank_21 desc;

全部评论

相关推荐

一面(25/2/28)(挂)    1、自我介绍?    2、介绍一下什么是索引?    3、MySQL都有哪些索引?索引类型?(聚集索引和二级索引)    4、举一个项目中的例子,使用MySQL做的查询,依据什么去做的查询?    5、有遇到过一些慢查询的场景吗?知道什么是慢查询吗?    6、explain关键字你通常会关注哪些输出信息作为判断。    7、有遇到过选错索引的情况吗?有别的索引失效的场景吗?    8、介绍一下MySQL的事务的隔离级别。    9、幻读是一个什么样的场景?    10、可重复读的隔离级别可以解决幻读,那他底层是怎么解决幻读的呢?    11、你项目中用到的是哪个隔离级别,为什么这么选择?    12、如果现在让你选择一个隔离级别,你会参考哪些条件去选择隔离级别?    13、介绍一下单例模式。    14、说到Bean的两种状态,单例和非单例,那么这两种方式对比一下?    15、单例适合哪些场景?    16、一般什么类需要去做一个单例?    17、写一个线程安全的单例模式的伪代码;为什么要判断两次是否为空呢?    18、商户缓存,介绍一下场景,要缓存哪些信息?    19、介绍缓存穿透、缓存雪崩、缓存击穿。    20、优惠卷秒杀,优惠券存在哪里?(尝试吟唱不断优化过程,被打断,这一块答的有点混乱,最后被批项目不熟了)    21、秒杀优化的阻塞队列是通过什么实现的?    22、为什么要用这个实现消息队列?有了解其他的消息队列吗?    23、异步下单场景,那你怎么通知用户下单成功?(直接成功,并且指出不足,说出有思考下单失败应该怎么办)    24、介绍一下点赞排行是个什么功能?为什么使用zset呢?(面试官好像不理解为什么要使用zset)    25、了解过zset的底层实现吗?(跳表)如果往zset中添加一个元素,这个过程是怎么样的?    26、feed流实现关注推送,关注推送功能是怎么实现的?(推模式)    27、有了解过拉模式吗?对比一下推拉模式有哪些优缺点?    手撕:(定时20min)    带TTL的LRU(天塌了,不会,换了一道)    34. 在排序数组中查找元素的第一个和最后一个位置    (用二分然后往两边找,被说时间复杂度不好)    反问:应该往什么方面去学习?    应该提升一下学习的深度,像刚才zset底层实现你了解是跳表,但是再往深了了解你就没有答出来。简历上列的一些点在日常工作中都能cover到的,需要提升一些深度,虽然说是实习,为了突出你的优点,最好是挑几个方向会了解的比较深。或者说不用了解的特别深,你做过的东西起码要能够完完全全的和别人说的清楚。
XiaoMuGGG:快手问我可重复读可以解决幻读吗,我说靠临键锁和mvcc极大程度解决幻读但不是完全解决,然后他就要问什么情况下幻读还会出现(正好没背),不要给自己挖坑
查看27道真题和解析
点赞 评论 收藏
分享
评论
5
4
分享

创作者周榜

更多
牛客网
牛客企业服务