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

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

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

全部评论

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
宇智波爱学习:我还没收到笔试
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务