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

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

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

#1.计算所有用户的答题完成情况
with t1 as(
select 
    b.uid,
    count(start_time) as total_cnt,
   COUNT(start_time)-COUNT(submit_time) as incomplete_cnt,
    ROUND((COUNT(start_time)-COUNT(submit_time)) /COUNT(*),3) incomplete_rate,
    level
from 
    exam_record as a 
right join(
    select 
        uid,
        level
    from 
        user_info
) as b
on a.uid = b.uid
group by uid
order by incomplete_rate asc)

#2.结果1:有满足条件的0级用户
select 
    uid,
    incomplete_cnt,
    incomplete_rate
from 
    t1
where exists(
    select 
        uid
    from 
        t1
    where 
        level = 0
        and incomplete_cnt > 2
)and level = 0
union all
#3.结果2:没有满足条件的0级用户,输出所有用户的答题情况
select 
    uid,
    incomplete_cnt,
    incomplete_rate
from 
    t1
where not exists(
    select 
        uid
    from 
        t1
    where 
        level = 0
        and incomplete_cnt > 2
)and total_cnt > 0
order by  incomplete_rate

这题好几个坑!

(1)第一步的时候我们要建立一个所有用户答题完成情况表。因为有聚合运算,我很自的想到把exam_record作为主表并命名为a,select a.uid这个时候结果是错的,因为题目要求的是所有0级用户的未完成情况,所以要select user_info的所有0级用户id。

而且,计算‘未完成率’的时候,注意检查不管你用哪种公式,分母不能为0否则会返回null!

(2)第二步建立所有0级用户的答题情况表——这一步就简单了,相信大家都没问题

(3)输出所有有作答记录的用户答题情况表(我漏看了这个重要条件),注意这些用户的total_cnt > 0否则我们要过滤掉哦~

tips:这一题两个结果1.2是互斥的,所以用 union 和 union all 都对

全部评论

相关推荐

03-03 10:35
3d人士会梦见住进比弗利山庄吗:这四个项目属于是初学者的玩具了。不知道面试官咋问,而且双非本搞算法除了9,还是保守至少c9
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务