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

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

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

select uid
        ,incomplete_cnt
        ,incomplete_rate
from(
    select ui.uid
            ,level
            ,count(if(submit_time is null,start_time,null)) AS incomplete_cnt
            ,count(start_time) AS complete_cnt /*有作答记录,用start_time*/
            ,round(if(count(start_time)=0,0,count(if(submit_time is null,start_time,null))/count(start_time)),3) AS incomplete_rate
            /*计算每个0级uid的未完成数是否大于2.
            通过max(1,0)判断全部的0级uid中是否有未完成数大于2的用户
            */
            ,max(if(level = 0 and count(if(submit_time is null,start_time,null))>2,1,0)) over() AS flag
    from user_info ui
    left join exam_record er on er.uid = ui.uid
    group by ui.uid
            ,level
)t
where (flag = 1 and level = 0) or (flag = 0 and complete_cnt>0)
order by incomplete_rate asc

1、表t记录所有uid的level以及作答情况,同时用group by来判断0级用户未完成作答数是否>2,if(level = 0 and count(if(submit_time is null,start_time,null))>2,1,0)。

2、max(xxx) over( )是做聚合运算,对整个表取最大值,如果max(1,0)=0,说明不存在超过一个0级uid未完成作答数>2,那么就是要输出所有有作答记录的用户的相关指标。

3、注意!在有0级用户未完成数>2的这种情况下,没有任何作答记录的0级用户也是要输出的,所以要用 user_info left join exam_record, user_info作为左表,这样没有exam_record的用户才能在左表中为null,输出其uid和incomplete_cnt和incomplete_rate

全部评论

相关推荐

投递美团等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务