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

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

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

/*按年份把各类tag的作答完成情况情况和排名计算出来*/
WITH t AS(
    select tag
        ,year(submit_time) AS start_year
        ,count(submit_time) AS exam_cnt
        ,rank() over(partition by year(submit_time) order by count(submit_time) desc) AS exam_cnt_rank
    from exam_record er
    inner join examination_info ei on er.exam_id = ei.exam_id
    where submit_time is not null and (submit_time between '2020-01-01' and '2020-06-30' or submit_time between '2021-01-01' and '2021-06-30')
    group by tag
            ,year(submit_time)
)

select tag
        ,sum(if(start_year=2020,exam_cnt,0)) AS exam_cnt_20
        ,sum(if(start_year=2021,exam_cnt,0)) AS exam_cnt_21
        ,CONCAT(round((sum(if(start_year=2021,exam_cnt,0)) - sum(if(start_year=2020,exam_cnt,0)))/sum(if(start_year=2020,exam_cnt,0)) * 100,1),'%') AS growth_rate
        ,sum(if(start_year=2020,exam_cnt_rank,0)) AS exam_cnt_rank_20
        ,sum(if(start_year=2021,exam_cnt_rank,0)) AS exam_cnt_rank_21
        ,sum(if(start_year=2021,exam_cnt_rank,0)) - sum(if(start_year=2020,exam_cnt_rank,0)) AS rank_delta
from t
where tag in
(
    select tag
    from t
    group by tag
    having count(start_year) >= 2
)
group by tag
order by growth_rate desc
        ,exam_cnt_rank_21 desc

1、表t的字段会有各个类别试卷在每一年的作答完成数量,以及在当年的排名

2、从t中筛选出两年都有作答的tag,having count(tag) > 2

3、按照tag对表t做group by,因此得到的都是统计数据,没法得到每一行的明细数据。用sum(if( ) )来读取出每一年的明细,

if(start_year=2020,exam_cnt,0):类似于一个隐形字段,如果start_year=2020,那么隐形字段取对应行的exam_cnt,否则取0,然后将同个tag内的隐形字段求和,sum(if(start_year=2020,exam_cnt,0))就能得到明细数据。

全部评论

相关推荐

09-22 22:22
中山大学 Java
双尔:赌对了,不用经历秋招的炼狱真的太好了,羡慕了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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