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

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

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

这题逻辑不难,只是需要多层嵌套,参考以下流程:

  1. 找到所有tag在2020,2021上半年的完成数
  2. 计算growth_rate,并生成各tag完成数排名
  3. 取出所有需要的字段,并计算排名变化(2021-2020年,无需取绝对值)
  4. 筛选出2020和2021年均有完成记录的tag,并按题目要求排序

运行时间:38ms, 超过 100% 的用户。

SELECT #第三步:取出所有需要的字段,并计算排名变化(2021-2020年,无需取绝对值)
  tag,
  exam_cnt_20,
  exam_cnt_21,
  growth_rate,
  exam_cnt_rank_20,
  exam_cnt_rank_21,
  CAST(exam_cnt_rank_21 as SIGNED) - CAST(exam_cnt_rank_20 AS SIGNED) rank_delta
FROM (
SELECT #第二步:计算growth_rate,并生成各tag完成数排名
  tag,
  exam_cnt_20,
  exam_cnt_21,
  IFNULL(CONCAT(ROUND((exam_cnt_21 - exam_cnt_20) / exam_cnt_20 * 100, 1), '%'), 0) growth_rate,
  RANK() OVER (ORDER BY exam_cnt_20 DESC) exam_cnt_rank_20,
  RANK() OVER (ORDER BY exam_cnt_21 DESC) exam_cnt_rank_21
  FROM (
  SELECT #第一步:找到所有tag在2020,2021上半年的完成数
    tag,
    SUM(IF(DATE_FORMAT(submit_time, '%Y-%m') BETWEEN '2020-01' AND '2020-06', 1, 0)) exam_cnt_20,
    SUM(IF(DATE_FORMAT(submit_time, '%Y-%m') BETWEEN '2021-01' AND '2021-06', 1, 0)) exam_cnt_21
  FROM exam_record
  LEFT JOIN examination_info ei USING(exam_id)
  GROUP BY 1) t1
) t2
WHERE exam_cnt_20 != 0 AND exam_cnt_21 != 0 # 第四步:筛选出2020和2021年均有完成记录的tag,并按题目要求排序
ORDER BY 4 desc, 6 desc
全部评论
你好,请问为什么【exam_cnt_rank_20】和【exam_cnt_rank_21】的数据类型要转成【signed】,【signed】不是会包括负数吗?而且这种情况下,如果【exam_cnt_rank_21】为1,【exam_cnt_rank_20】为2,那【rank_delta】岂不是会为负数?
3 回复 分享
发布于 2022-05-07 23:34
4.6分别是对应select后面的字段顺序,即4就是growthrate
3 回复 分享
发布于 2021-12-19 14:23
谁能告诉我,为什么最后要用cast把排名给转换成signed才行呀=>答案参见这里https://blog.csdn.net/weixin_52323239/article/details/127850839
2 回复 分享
发布于 2023-03-06 23:26 黑龙江
WHERE exam_cnt_20 != 0 AND exam_cnt_21 != 0 写在t2的里面为什么就会出错啊?exam_cnt_rank_21由rank=2变成rank=1了
1 回复 分享
发布于 2022-03-09 15:40
为什么20年和21年的排名变化需要按照降序排列,题目里也没体现出来呀.求指教~
点赞 回复 分享
发布于 2024-06-18 18:43 上海
IFNULL(CONCAT(ROUND((exam_cnt_21 - exam_cnt_20) / exam_cnt_20 * 100, 1), '%'), 0) growth_rate 为什么使用ifnull呀
点赞 回复 分享
发布于 2024-03-16 21:30 广东
有没有人知道为什么我的代码和楼主的一样,但就是显示结果错误
点赞 回复 分享
发布于 2023-03-12 16:51 新加坡
你这个运行不都是0吗。。。。。
点赞 回复 分享
发布于 2023-03-08 11:48 香港
为啥要筛选出都有答题的情况啊,0不是也能判断吗?
点赞 回复 分享
发布于 2023-03-07 20:57 江苏
完了,没看懂,第一步的group by 1,这个'1'是从哪来的啊
点赞 回复 分享
发布于 2022-10-24 15:38 上海
好清晰啊啊!!!!我写的比这混乱多了我丢TVT
点赞 回复 分享
发布于 2022-10-13 21:12 江西
rank_delta是什么意思
点赞 回复 分享
发布于 2022-09-12 08:00 广东
谁能告诉我,为什么最后要用cast把排名给转换成signed才行呀
点赞 回复 分享
发布于 2022-07-07 17:28
为什么是RANK而不是DENSE_RANK()
点赞 回复 分享
发布于 2022-02-26 07:30
大佬你好,请问exam_cnt_rank_21 ,xam_cnt_rank_20 为什么会有可能为负数的情况呢 按理说rank()不是像1,1,3这种,为什么可能为负数呢
点赞 回复 分享
发布于 2022-01-24 21:19
求助!最后ORDER BY 4 desc, 6 desc中的‘4’和‘6’是什么意思?为什么可以这样表示呀
点赞 回复 分享
发布于 2021-12-13 20:47

相关推荐

2025-12-13 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
评论
80
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务