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

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

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

全部评论

相关推荐

02-16 13:52
门头沟学院 Java
给🐭🐭个面试机会吧:嘿,mvbatis
点赞 评论 收藏
分享
神哥不得了:神哥来啦~1.建议不要包装,很容易问穿2.没日常也能找到暑期3.简历模板换一下,字体和版式看着好难受,而且最好压缩到一页,技术的倒数第2和3重复啦,项目建议换两个高质量的上去,如果时间够的话,八股就把高频top50的题目多巩固几遍,吃透,注意不要找假高频,这样绝对能找到暑期
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务