题解 | #根据指定记录是否存在输出不同情况#

根据指定记录是否存在输出不同情况

http://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b

问题分析

你筛选表中的数据,当有任意一个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;

结果截图


全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞 回复 分享
发布于 2022-04-27 12:07

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务