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

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

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

全部评论

相关推荐

owwhy:难,技术栈在嵌入式这块显得非常浅,并且简历有大问题。教育经历浓缩成两行就行了,写什么主修课程,说的不好听这块没人在意,自我评价删了,项目写详细点,最终简历缩成一页。相关技能怎么说呢,有点差了,还写成这么多行
投了多少份简历才上岸
点赞 评论 收藏
分享
拒绝996的悲伤蛙:此贴终结|给路过的牛友分享一下心得👇 实习的时候不要光埋头干活,身边的大佬同事才是真·宝藏人脉!大胆请教他们工作以及职场上的问题以我的经历,我的带教有十几年工作经验,做过运维、后端开发、web测试,现在是高级软测,是行走的避坑指南 我之前纠结要不要学Web测试简历,被他一句话点醒:Web发展成熟,岗位需求在缩,AI对互联网的冲击可能以后架构+开发+测试一人包揽。现在用户更多用的是移动端APP/小程序,相比之下天天守着电脑刷网页的人基数小。 这里我的纠结得到反馈,于是我又把简历发给带教,获得了一对一的简历指导。 感兴趣的可以看看: 1.教育背景:本科→本科(全日制) 2.实习经历:总体问题不大,但第2点要稍作修改,可以写但做功课,如风机、水箱……可能会问用哪个供应商的?使用寿命、型号、电压电流、多少秒会触发逻辑? 3.项目经历(坑太多,大型翻车现场): - 项目名越直白越好,让人一眼就知道你干了啥。 -用的什么语言设计核心接口,异步执行做功课,涉及线程问题,被问可回答n个功能是如何错开异步执行的 - “验证任务消费……阻塞丢包”“高负载稳定性”这种词,没三五年开发功底不要写,不然面试时被问线程、数量级、CPU占用,内存带宽等影响性能的直接原地社死。 -做功课 -做功课,测了哪些模块,如何设计,接口流量抓包,token,变量…… -做功课,要熟悉网络协议…… 带教之前做互联网开发的时候面试过很多人,总的来说不要为了显得项目高大上过渡包装,写了就要做好拷打的准备
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务