题解 | #根据指定记录是否存在输出不同情况#
根据指定记录是否存在输出不同情况
http://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b
问题分析
你筛选表中的数据,当有任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);若不存在这样的用户,则输出所有有作答记录的用户的这两个指标。结果按未完成率升序排序。
- 筛选出0级用户并计算其未完成试卷数;
- 当有0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);
- 若没有0级用户未完成试卷数大于2,则输出所有有作答记录的用户的试卷未完成数和未完成率(保留3位小数);
- 结果按未完成率升序排序
知识点
with语句:相同查询唯一化,有效简化代码,提升代码的可读性;
count():计数函数,计算非空值的个数;
round():四舍五入函数,可以指定保留小数位数;
left join:左外连接;
union all:表拼接,不去重;
答案参考
WITH new_exam_record AS (SELECT uid,level ,(count(start_time)-count(submit_time))incomplete_cnt ,if(level=0 and count(submit_time)/count(start_time) is null, 0,round(1-count(submit_time)/count(start_time),3))incomplete_rate FROM user_info left join exam_record using(uid) GROUP BY uid,level) SELECT uid,incomplete_cnt,incomplete_rate FROM new_exam_record WHERE exists(select uid from new_exam_record where level=0 and incomplete_cnt>2) and level=0 UNION ALL SELECT uid,incomplete_cnt,incomplete_rate FROM new_exam_record WHERE not exists(select uid from new_exam_record where level=0 and incomplete_cnt>2) and incomplete_rate is not null ORDER BY incomplete_rate;