题解 | #根据指定记录是否存在输出不同情况#
根据指定记录是否存在输出不同情况
https://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b
#这个题首先我right join 了user表,主要是他的需求当中如果满足“任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率”的条件的时候,他需要显示所有0级的用户统计信息(有些0级用户可能没有提交记录,但是也要显示)
我的大体思想是,先不管他给的条件,先把每个用户的指标先统计出来,然后通过条件过滤
第一层:right join user表,计算出每个用户的incompetent_cnt(这里采用的是用户在exam_record的记录总数allNum- 用户已经submit的记录数)
第二层:根据第一层结果计算incomplete_rate的值,isKeep 是用来判断这条记录是否保持的标记,如果计算结果1则保留,0则不保留,这会在第三层过滤,这个值的运算思路:开窗统计是否有0级用户incompetent_cnt > 2 ,如果有:则只保留0级用户的数据(包括exam表中没有提交记录的用户),如果没有:则只保留在exam表中有提交记录的用户,所以整个外层是一个if,
第三层:统计排序格式化即可。
select d.uid, d.incomplete_cnt, format(d.incomplete_rate,3) as incomplete_rate from ( select c.uid, c.incomplete_cnt, if(c.incomplete_cnt = 0,0,incomplete_cnt/submitNum) as incomplete_rate, if(sum(case when c.incomplete_cnt > 2 && c.level = 0 then 1 else 0 end) over() > 0,case when c.level=0 then 1 else 0 end,case when c.submitNum > 0 then 1 else 0 end)as isKeep from ( select b.uid, sum(case when a.uid is not null then 1 else 0 end) - sum(case when a.submit_time is not null then 1 else 0 end) as incomplete_cnt, sum(case when a.uid is not null then 1 else 0 end) as submitNum, b.level from exam_record a right join user_info b on a.uid = b.uid group by b.uid ) c ) d where d.isKeep = 1 order by d.incomplete_rate