题解 | #近三个月未完成试卷数为0的用户完成情况#
https://www.nowcoder.com/practice/4a3acb02b34a4ecf9045cefbc05453fa
一、题意
找到每个人近三个有试卷作答记录的月份中没有试卷是未完成状态的用户的试卷作答完成数,按试卷完成数和用户ID降序排名。由示例数据结果输出如下:
关键字 近三个月试卷作答
题意解释:用户1006近三个有作答试卷的月份为202109、202108、202106,作答试卷数为3,全部完成;用户1001近三个有作答试卷的月份为202109、202108、202107,作答试卷数为5,完成试卷数为4,因为有未完成试卷,故过滤掉。
二、理论
DENSE_RANK()
over(partition by xxx order by xxx desc)
但凡涉及到统计 排名 完成次数等等这种题型 大概率就是使用窗口函数 MYSQL8.0支持窗口函数
你可以理解为 窗口函数是统计神器
三、实战
3.1、调试日期 因为要根据月份筛选连续作答次数
select date_format(start_time,"%Y%m") from exam_record
3.2、然后就是根据用户进行分组 根据月份进行降序paix
select uid,exam_id,start_time,submit_time, DENSE_RANK()over(PARTITION by uid order by date_format(start_time,"%Y%m") desc) `DENSE_RANK` from exam_record
3.3、然后 就是进行条件筛选 where group by having order by
select A.uid, count(A.submit_time) exam_complete_cnt from ( select uid,exam_id,start_time,submit_time,score, DENSE_RANK()over(PARTITION by uid order by date_format(start_time,"%Y%m") desc) `DENSE_RANK` from exam_record ) A where A.DENSE_RANK <= 3 -- 筛选近三个月有作答试卷的月份 group by A.uid having count(uid) = count(score) -- having count(start_time) = count(submit_time) -- 过滤近三个月存在未完成试卷的用户 order by exam_complete_cnt desc , uid desc
四、细节注意
在这道题中 自己 唯一不理解的就是 -- 过滤近三个月存在未完成试卷的用户 这个条件
having count(uid) = count(score)
-- having count(start_time) = count(submit_time) 这个两个条件都可以
这是看了结果集 之后盲猜的 这种条件的筛选 如果再来一次 可能自己依然不能第一时间想到用这个条件筛选
科大讯飞公司氛围 477人发布