题解 | #连续两次作答试卷的最大时间窗#

连续两次作答试卷的最大时间窗

https://www.nowcoder.com/practice/9dcc0eebb8394e79ada1d4d4e979d73c

分享一下自己的思路,因为自己是菜b,所以用的都是菜b都能看懂的思路,可能不是最快捷,但力求最清晰。

第1步:找出2021年作答过试卷的人中,连续两次作答试卷的时间窗的表t1
select uid,datediff(start_time,lag(start_time,1)over(partition by uid order by start_time))+1 days_window from exam_record
where year(start_time) = 2021
(在datediff函数后还需要加1,因为如“解释”所示用户1006分别在20210901、20210906、20210907作答过3次试卷,连续两次作答最大时间窗为6天(1号到6号)。如果不加1,那么最大时间窗就变成6-1=5了!)

第2步:找出2021年至少有两天作答过试卷的人中,连续两次作答试卷的最大时间窗的表a
select uid,max(days_window) days_window from
(select uid,datediff(start_time,lag(start_time,1)over(partition by uid order by start_time))+1 days_window from exam_record
where year(start_time) = 2021) t1
where days_window is not null
group by uid
having max(days_window) != 1
where days_window is not null是为了过滤某人在2021年第一次作答时间减去之前不存在的作答时间所遗留下的null,同时可以过滤某人在2021年内只在某一天作答了一次的情况所遗留下的nul
having max(days_window) != 1是为了过做了两张试卷,但是只有一天的作答记录的情况

第3步:找出2021年作答过试卷的人,每个人平均每天做了多少张试卷的表b
select uid,count(start_time)/(datediff(max(start_time),min(start_time))+1) avg_exam_cnt from exam_record
where year(start_time) = 2021
group by uid
在datediff函数后还需要加1,因为如“解释”所示用户1号到7号这7天里共做了3张试卷,平均每天3/7=0.428571张。如果不加1,那么就变成平均每天3/6了!

最后一步:将表a的uid及表b的uid作为连接键,将表a连接表b,并从中提取出我们最后想要的输出结果
select a.uid uid,days_window,round(days_window*avg_exam_cnt,2) avg_exam_cnt from
(select uid,max(days_window) days_window from
(select uid,datediff(start_time,lag(start_time,1)over(partition by uid order by start_time))+1 days_window from exam_record
where year(start_time) = 2021) t1
where days_window is not null
group by uid
having max(days_window) != 1) a
join 
(select uid,count(start_time)/(datediff(max(start_time),min(start_time))+1) avg_exam_cnt from exam_record
where year(start_time) = 2021
group by uid) b
on a.uid = b.uid
order by days_window desc,avg_exam_cnt desc
(这里只可以用内连接或者左连接,不可以用右连接,不然就会出现做了两张试卷,但是只有一天的作答记录的uid

写在最后,这题涉及到时间的字段名得用start_time,不用能submit_time,因为题目的要求是作答的人,而不仅仅指交卷的人,所以submit_time是会出现null的,我第一次做就是用的submit_time结果报错,接着把所有的submit_time换成start_time就好了。

全部评论

相关推荐

网安已死趁早转行:山东这地方有点说法
点赞 评论 收藏
分享
03-25 10:54
华南理工大学
昨天收到腾讯音乐OC了,xdm,准备去做TME孝子了!正式宣布:TME,你的兵来了!BG:本硕都是华南理工软件工程专业,有腾讯CSIG和字节的两段实习,还有一篇A区论文一作在投。OC的是酷狗的后台开发。不为别的,就为这第一个OC,想哭!流程里还有团子和鹅,上周被阿里一轮游了……脆皮大学生表示:淘宝已卸载,谢谢。广州人,就想找个离家近的厂,当然也有自己的一些考虑,放在最后,兄弟们要是没有精力海投或者最后要抉择Offer,可以参考我的逻辑。TL:3.14网申-3.17一面-3.19二面-3.21 hr面-3.24OC。TME没有笔试,我就面试的时候手撕了一轮,所以感觉流程推进很快,刚好10天,顺利...
都有实习了:10天速通?恭喜大佬,而且真的好厉害 但是有一个***********************诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖哈哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务