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

题目描述
请计算2021年上半年各类试卷的做完次数相比2020年上半年同期的增长率(百分比格式,保留1位小数),以及做完次数排名变化,按增长率和21年排名降序输出
https://www.nowcoder.com/practice/13415dff75784a57bedb6d195262be7b

思路:
1.先计算2020,2021年上半年每一类试卷

select e.tag,year(start_time) as start_year,count(score) exam_cnt
from examination_info as e join exam_record as r on e.exam_id=r.exam_id
where month(start_time)<=6 and year(start_time)=2020
group by e.tag,start_year
having exam_cnt!=0

select e.tag,year(start_time) as start_year,count(score) exam_cnt
from examination_info as e join exam_record as r on e.exam_id=r.exam_id
where month(start_time)<=6 and year(start_time)=2021
group by e.tag,start_year
having exam_cnt!=0

  1. 计算排名
select *,rank() over (order by exam_cnt desc) as exam_cnt_rank_2021
from (
    select e.tag,year(start_time) as start_year,count(score) exam_cnt_2021
    from examination_info as e join exam_record as r on e.exam_id=r.exam_id
    where month(start_time)<=6 and year(start_time)=2021
    group by e.tag,start_year
    having exam_cnt!=0
)
select *,rank() over (order by exam_cnt desc) as exam_cnt_rank_2020
from (
    select e.tag,year(start_time) as start_year,count(score) exam_cnt_2020
    from examination_info as e join exam_record as r on e.exam_id=r.exam_id
    where month(start_time)<=6 and year(start_time)=2020
    group by e.tag,start_year
    having exam_cnt!=0
)

select t2021.tag,
t2020.exam_cnt_20,
t2021.exam_cnt_21,
concat(round((t2021.exam_cnt_21-t2020.exam_cnt_20)/t2020.exam_cnt_20*100,1),"%") as growth_rate,
t2020.exam_cnt_rank_20,
t2021.exam_cnt_rank_21,
(cast(t2021.exam_cnt_rank_21 as signed)-cast(t2020.exam_cnt_rank_20 as signed) )as rank_delta
from (
    select *,rank() over (order by exam_cnt_21 desc) as exam_cnt_rank_21
    from (
        select e.tag,year(start_time) as start_year,count(score) exam_cnt_21
        from examination_info as e join exam_record as r on e.exam_id=r.exam_id
        where month(start_time)<=6 and year(start_time)=2021
        group by e.tag,start_year
        having exam_cnt_21!=0
    ) as t21
) as t2021 ,(
    select *,rank() over (order by exam_cnt_20 desc) as exam_cnt_rank_20
    from (
        select e.tag,year(start_time) as start_year,count(score) exam_cnt_20
        from examination_info as e join exam_record as r on e.exam_id=r.exam_id
        where month(start_time)<=6 and year(start_time)=2020
        group by e.tag,start_year
        having exam_cnt_20!=0
    ) as t20
)as t2020 
where t2021.tag=t2020.tag 
order by growth_rate desc,exam_cnt_rank_21 desc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值