题解 | #未完成率较高的50%用户近三个月答卷情况#
未完成率较高的50%用户近三个月答卷情况
https://www.nowcoder.com/practice/3e598a2dcd854db8b1a3c48e5904fe1c
从这道题目本身看,难点不是很多,个人感觉最关键的就是如何理解未完成率较高的50%用户,这也卡了我蛮久。
通过观察发现,这个未完成率前50%的用户的计算就是先得到各个用户总的完成率然后进行排序,根据排名进行筛选,在这里我遇到了一个问题,如何对这前50%的用户进行筛选,一开始我用的是dense_rank()over()进行排序,然后想着算出总用户数num,取前一半也即round(num/2)个用户的数据,但这样行不通。
随后,参考了优秀解答发现排序函数中还有percent_rank()over()的用法,我也是第一次见这种用法,这样就直接得到了各个用户的完成情况在总体中的百分位,然后直接筛选即可。
select
uid,
start_month,
count(start_time) total_cnt,
count(submit_time) complete_time
from
(
select
uid,
date_format(start_time, '%Y%m') start_month,
dense_rank() over(
partition by uid
order by
date_format(start_time, '%Y%m') desc
) rk,
start_time,
submit_time
from
exam_record
where
uid in (select uid from // 使用子查询查找未完成率较高的50%用户且等级为6、7级
(select uid,level,
percent_rank()over(order by incomplete_rate desc) rk
from
(
select
er.uid uid,
level,
sum(isnull(submit_time)) / count(start_time) incomplete_rate
from
exam_record as er
left join user_info as ui on er.uid = ui.uid
left join examination_info as ei on er.exam_id = ei.exam_id
where
ei.tag = 'SQL'
group by
er.uid
) a
) b
where
rk <= 0.5
and level >= 6
)
) c
where
rk <= 3
group by
uid,
start_month
order by
uid,
start_month