难度没想象中那么大
-- 第一步:过渡表,做出2020年和2021年不同tag的做完次数和做完次数排名
with t AS
(
select *,RANK()over(order by exam_cnt desc) as exam_cnt_rank
from(select tag,year(submit_time) as start_year,count(score) as exam_cnt
from exam_record t
join examination_info t1 on t.exam_id = t1.exam_id
where date_format(submit_time,"%Y%m")<='202006' and date_format(submit_time,"%Y%m")>='202001'
group by tag,start_year) t
union all
select *,RANK()over(order by exam_cnt desc) as exam_cnt_rank
from(select tag,year(submit_time) as start_year,count(score) as exam_cnt
from exam_record t
join examination_info t1 on t.exam_id = t1.exam_id
where date_format(submit_time,"%Y%m")<='202106' and date_format(submit_time,"%Y%m")>='202101'
group by tag,start_year) t1
)
-- 第二步:一个个列出来就完事儿了
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(1) =2)
group by tag
order by growth_rate desc,rank_delta DESC