题目

请统计SQL试卷上未完成率较高的50%用户中,6级和7级用户在有试卷作答记录的近三个月中,每个月的答卷数目和完成数目。按用户ID、月份升序排序。

步骤:

1、SQL试卷上未完成率较高的50%用户——计算未完成率,然后使用ntile() over(未完成率降序) 窗口函数,创建子查询,选择ranking=1且是6/7级用户

select uid
        from(
              select uid,level,
                   -- sum(if(submit_time is null,1,0)) incomplete_cnt,
                   -- count(start_time) total_cnt,
                   -- round(sum(if(submit_time is null,1,0))/count(start_time),4) incomplete_rate,
             		ntile(2) over(order by (sum(if(submit_time is null,1,0))/count(start_time)) desc) as incomplete_ranking
              from exam_record join user_info using(uid)
                              join examination_info using(exam_id)
              where tag='SQL'
              group by uid)
 where a.incomplete_ranking=1 and level in (6,7)

2、有试卷作答记录的近三个月

select *
from(
    select uid,start_time,submit_time,
        dense_rank() over(partition by uid order by left(start_time,7) desc) as time_ranking
        from exam_record) rk
where rk.time_ranking<=3

3、每个月的答卷数目和完成数目 group by uid,start_month

select uid,
    DATE_FORMAT(start_time,'%Y%m') start_month,
    count(start_time) total_cnt,
    count(submit_time) complete_cnt
from(
    select uid,start_time,submit_time,
    dense_rank() over(partition by uid order by left(start_time,7) desc) as time_ranking
    from exam_record) rk
where rk.time_ranking<=3 and uid in(
        select uid
        from (select uid, 
                        level,
                        -- sum(if(submit_time is null,1,0)) incomplete_cnt,
                        -- count(start_time) total_cnt,
                        -- round(sum(if(submit_time is null,1,0))/count(start_time),4) incomplete_rate,
                        ntile(2) over(order by (sum(if(submit_time is null,1,0))/count(start_time)) desc) as incomplete_ranking
                    from exam_record join user_info using(uid)
                    join examination_info using(exam_id)
                    where tag='SQL'
                    group by uid) a
            where a.incomplete_ranking=1 and level in (6,7)
            ) 
group by uid,start_month
order by uid,start_month