题解 | #近三个月未完成试卷数为0的用户完成情况#

近三个月未完成试卷数为0的用户完成情况

http://www.nowcoder.com/practice/4a3acb02b34a4ecf9045cefbc05453fa

SQL30 近三个月未完成试卷数为0的用户完成情况

题目主要信息:

  • 找到每个人近三个有试卷作答记录的月份中没有试卷是未完成状态的用户的试卷作答完成数,按试卷完成数和用户ID降序排名
  • 试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

问题拆分:

  • 先从表exam_record中筛选出用户ID、答题开始时间、得分以及月份的降序排列:
    • 用户ID、开始时间、得分可以直接获取。
    • 月份降序我们用分组连续排名。知识点:dense_rank() over()、date_format() 对每个用户ID内进行排名,因为一个月可能出现多次,所以要采用连续排名,月份大的在前面月份小的在后,符合离现在最近的月份在前。dense_rank() over(partition by uid order by date_format(start_time, '%Y%m') desc) as recent_months
  • 从上述结果中筛选出每个用户近三个的答题数:
    • 对于每个用户进行筛选,因此要以uid分组。知识点:group by
    • 只筛出近三个月的内容,因此上述排名我们只要排名小于等于3的。知识点:where
    • 过滤掉未完成试卷的用户,需要再分组后判断每组用户ID出现次数和得分出现次数是否一致,因为有得分才代表完成了试卷。知识点:having、count()
    • 统计上述没有过滤掉的结果中,每人的得分的总数,代表完成了多少试卷。知识点:count()
  • 根据先答题数后用户ID的降序次序输出。order by exam_complete_cnt desc, uid desc 知识点:order by...desc

代码:

select uid,
       count(score) as exam_complete_cnt
from(
    select uid, start_time, score,
           dense_rank() over(partition by uid order by date_format(start_time, '%Y%m') desc) as recent_months
    from exam_record
) recent_table
where recent_months <= 3
group by uid
having count(score) = count(uid)
order by exam_complete_cnt desc, uid desc

孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
这个答案应该有遗漏,总共只有1个月或2个月的用户应该也会统计出来,最终能通过应该是测试用例不完善。
4 回复 分享
发布于 2022-04-03 10:56
妙绝
1 回复 分享
发布于 2022-04-08 10:08
巧妙
点赞 回复 分享
发布于 03-30 02:01 上海
想问问为什么要用dense_rank呢?
点赞 回复 分享
发布于 2024-01-20 22:57 广东
提问:为什么把这句中的start_time换成submit_time的出来的结果不对呢?没有把1001号用户筛掉。dense_rank() over(partition by uid order by date_format(start_time, '%Y%m') desc) as recent_months
点赞 回复 分享
发布于 2023-08-17 15:56 河南
select uid, count(score) as exam_complete_cnt from exam_record er where date_format(start_time, '%Y%m') not in ( select date_format(start_time, '%Y%m') as time1 from exam_record where submit_time is null ) group by uid having count(score) >= 3 order by exam_complete_cnt desc, uid desc 我这样写 哪里有问题 我觉得逻辑也对呀
点赞 回复 分享
发布于 2023-05-24 16:11 未知
请问为什么把order by date_format(start_time, '%Y%m') desc写成order by month(start_time desc后,输出的结果不对了呢
点赞 回复 分享
发布于 2022-12-01 19:21 广东
请问为什么having score is not null会报错呀
点赞 回复 分享
发布于 2022-08-27 22:17 江苏
丢了一种可能吧:如果有些人每个月都答完了且有分数,但是只做了2个月 怎么筛??
点赞 回复 分享
发布于 2022-07-09 00:40
那10001这个人 是怎么被筛掉的???
点赞 回复 分享
发布于 2022-07-09 00:36
这个是不是应该 having count(score or null) = count(uid or null)
点赞 回复 分享
发布于 2022-04-08 10:17
是不是可以select uid, count(submit_time),然后having count(submit_time) = count(uid)这样写呢?毕竟submit_time是null,score也会是null
点赞 回复 分享
发布于 2022-03-27 12:04
你好。想问一下在选择了submit_time做一列以后,过滤掉未完成试卷的用户的时候为什么不能用 where submit_time is not null?
点赞 回复 分享
发布于 2022-02-23 10:55
用date_format(start_time, '%Y%m') desc 也可以正确排序2022.02 2022.01 2021.12 这种情况吗
点赞 回复 分享
发布于 2022-02-12 19:15

相关推荐

秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
A_SOUL_Off...:疑似加班加出幻觉了
点赞 评论 收藏
分享
评论
98
6
分享

创作者周榜

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