通过代码

select
    uid,
    mon start_month,
    count(*) total_cnt,
    count(score) cmoplete_cnt
from (SELECT
          u_i.uid,
          start_time,
          submit_time,
          score,
          DATE_FORMAT(start_time,'%Y%m') mon,
          DENSE_RANK() over(
              partition by   uid
              order by  DATE_FORMAT(start_time,'%Y%m') desc
              )  ranking
      FROM
          (SELECT
               uid,
               percent_rank()over(
                   order by (count(*) - COUNT(score)) /  count(*) desc
                   ) rate0
           FROM
               exam_record
                   RIGHT JOIN
               examination_info
               ON
                       exam_record.exam_id = examination_info.exam_id
           WHERE
                   tag = 'SQL'
           GROUP BY
               uid) pa
              RIGHT JOIN user_info u_i
                         on u_i.uid = pa.uid
              left join exam_record e_r
                        on e_r.uid = u_i.uid
      where
              level>5 and
              rate0 <=0.5
     )pai
where ranking<4
group by uid,mon
order by uid,mon;

思路

这道题,我原称之为究极套娃!!!!!真的是那啥带那啥一套又一套、

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


1.sql试卷未完成率较高的50%用户

2.有试卷作答记录的6 .7 级近三个月

3.答卷数、完成数、排序


1.sql试卷未完成率较高的用户

SELECT
 uid,
 percent_rank()over(
     order by (count(*) - COUNT(score)) /  count(*) desc
     ) rate0
FROM
 exam_record
     RIGHT JOIN
 examination_info
 ON
         exam_record.exam_id = examination_info.exam_id
WHERE
     tag = 'SQL'
GROUP BY
  uid

上上一篇有percent_rank就不说了,那么问题是:不是较高的50%吗

是因为窗口函数写在select里不能用where或者having只能进行一个子查询,所以


2.有试卷作答记录的6 .7 级近三个月

SELECT
  u_i.uid,
  score,
  DATE_FORMAT(start_time,'%Y%m') mon,
  DENSE_RANK() over(
      partition by   uid
      order by  DATE_FORMAT(start_time,'%Y%m') desc
      )  ranking
FROM
  (1.代码) pa
      RIGHT JOIN user_info u_i
                 on u_i.uid = pa.uid
      left join exam_record e_r
                on e_r.uid = u_i.uid
where
      level>5 and
      rate0 <=0.5

啊,刚做过近三个月也就是order by DATE_FORMAT(start_time,'%Y%m') desc,然后再进行子查询<4 筛选出来就行

在这一层进行 %50操作 ,顺便一个表连接把6 7 级搞定(因为最高就是7级所以这里可用>5) 再顺便吧最后一层要用的东西查出来。


3.答卷数、完成数

select
    uid,
    mon start_month,
    count(*) total_cnt,
    count(score) cmoplete_cnt
from (2.代码)pai
where ranking<4
group by uid,mon
order by uid,mon;

count会忽略掉null所以直接count(score)就好