问题分析

你筛选表中的数据,当有任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);若不存在这样的用户,则输出所有有作答记录的用户的这两个指标。结果按未完成率升序排序。
  1. 筛选出0级用户并计算其未完成试卷数;
  2. 当有0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);
  3. 若没有0级用户未完成试卷数大于2,则输出所有有作答记录的用户的试卷未完成数和未完成率(保留3位小数);
  4. 结果按未完成率升序排序
本题的每一步实现起来都不是很难,难的是如何将这几步按题目要求合理地组织起来。

知识点

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;

结果截图