题解 | #试卷完成数同比2020年的增长率及排名变化#
试卷完成数同比2020年的增长率及排名变化
https://www.nowcoder.com/practice/13415dff75784a57bedb6d195262be7b
with data_f_use as ( select tag, exam_id, year(submit_time) as complete_year from exam_record left join examination_info using (exam_id) where submit_time is not null and year(submit_time) in (2020, 2021) and month(submit_time) <= 6 ), data_f_cal as ( select tag, complete_year, count(complete_year) exam_cnt from data_f_use group by tag, complete_year ), data_ranked as ( select tag, complete_year, exam_cnt, rank()over(partition by complete_year order by exam_cnt desc) exam_cnt_rank from data_f_cal ) select tag, exam_cnt_20, exam_cnt_21, concat(round( 100 * (exam_cnt_21 - exam_cnt_20) / exam_cnt_20 , 1), '%' )as growth_rate, exam_cnt_rank_20, exam_cnt_rank_21, cast(exam_cnt_rank_21 as signed) - cast(exam_cnt_rank_20 as signed) as rank_delta from ( select tag, exam_cnt as exam_cnt_20, lead(exam_cnt, 1)over(partition by tag order by complete_year) as exam_cnt_21, exam_cnt_rank as exam_cnt_rank_20, lead(exam_cnt_rank, 1)over(partition by tag order by complete_year) as exam_cnt_rank_21 from data_ranked ) a where exam_cnt_21 is not null order by growth_rate desc, exam_cnt_rank_21 desc
窗口函数返回的值是 int
CAST是将rank结果的数据类型转换, 以下抄自一位大牛的博客。由此需要将其转换为signed类型。 ———这里不太懂,只能硬记下来了
注意RANK()返回无符号类型,排名变化可能为负,直接减会出错
查看7道真题和解析