题解 | #每个6/7级用户活跃情况#

每个6/7级用户活跃情况

https://www.nowcoder.com/practice/a32c7c8590324c96950417c57fa6ecd1

这道题前前后后用了我大半天时间,特此记录,用的都是很基础的方法,应该可以给大家一个较为清晰的思路,这里贴上每个步骤的拆解与最终代码。

#1.算出每个用户的活跃月份数:等于在试卷区活跃月份数+在答题区活跃月份数,注意:二者重复仅算一次
select uid,count(act_month_total) from(
select ui.uid uid,if(date_format(er.start_time,'%y%m') is not null ,date_format(er.start_time,'%y%m'),null) act_month_total
from exam_record er right  join user_info ui using (uid)
group by ui.uid,act_month_total
union
select ui.uid uid,if(date_format(pr.submit_time,'%y%m') is not null ,date_format(pr.submit_time,'%y%m'),null) result
from practice_record pr right  join user_info ui using (uid)
group by ui.uid,result) A1
group by A1.uid;

/*
每个用户的活跃月份数是由试卷区活跃月份数+在答题区活跃月份数组成的,但是会出现某个月在这两个区都有活跃的情况,此时应该只记录1次,可以使用union来去重
*/

#2.算出每位用户的总活跃天数、答卷活跃天数、答题活跃天数,注意:答卷活跃天数+答题活跃天数未必等于总活跃天数,二者可能有重复
#每位用户的总活跃天数
select uid,count(d1) act_month_total from(
select uid,if(date_format(er.start_time,'%y%m%d') is not null and year(er.start_time) = 2021,date_format(er.start_time,'%y%m%d'),null) d1
from user_info ui left join exam_record er using (uid)
where level in (6,7)
group by uid,d1
union
select uid,if(date_format(pr.submit_time,'%y%m%d') is not null and year(pr.submit_time) = 2021,date_format(pr.submit_time,'%y%m%d'),null) d2
from user_info ui left join practice_record pr using (uid)
where level in (6,7)
group by uid,d2) t1
group by uid;
/*
这里我是将第二步又拆分为2个小步,因为在统计总活跃天数的时候同样会出现如1中的重复问题,而在统计答卷活跃天数和答题活跃天数不需要注意重复问题,换句话说,总活跃天数不一定等于答卷活跃天数 + 答题活跃天数,应该是小于等于,这里题目给的示例数据都是等于,所以存在较大的迷惑性,可以看出在这里我在处理去重时依然使用的union,同时在这一步我实现了6、7等级的条件筛选,后续在进行多表联合时只需使用外连接即可。
*/
#答卷活跃天数、答题活跃天数
select uid,count(distinct if(year(er.start_time) = 2021,date_format(er.start_time,'%y%m%d'),null)) act_days_2021_exam,count(distinct if(year(pr.submit_time) = 2021,date_format(pr.submit_time,'%y%m%d'),null)) act_days_2021_question
from user_info ui left join exam_record er using (uid)
left join practice_record pr using (uid)
group by uid;
/*
这一步的重点是select语句的编写,count(distinct if(year(er.start_time) = 2021,date_format(er.start_time,'%y%m%d'),null)) act_days_2021_exam,这一句意思是筛选出是2021年的答卷记录时间,并且如果该时间有多个相同,需用distinct关键字去重只算一个,后面那个也是一样
*/
#最终组合
select uid,act_month_total,act_days_2021,act_days_2021_exam,act_days_2021_question
from (
select uid,count(act_month_total) act_month_total from(
select ui.uid uid,if(date_format(er.start_time,'%y%m') is not null ,date_format(er.start_time,'%y%m'),null) act_month_total
from exam_record er right  join user_info ui using (uid)
group by ui.uid,act_month_total
union
select ui.uid uid,if(date_format(pr.submit_time,'%y%m') is not null ,date_format(pr.submit_time,'%y%m'),null) result
from practice_record pr right  join user_info ui using (uid)
group by ui.uid,result) A1
group by A1.uid
     ) T1 right join (
select uid,count(d1) act_days_2021 from(
select uid,if(date_format(er.start_time,'%y%m%d') is not null and year(er.start_time) = 2021,date_format(er.start_time,'%y%m%d'),null) d1
from user_info ui left join exam_record er using (uid)
where level in (6,7)
group by uid,d1
union
select uid,if(date_format(pr.submit_time,'%y%m%d') is not null and year(pr.submit_time) = 2021,date_format(pr.submit_time,'%y%m%d'),null) d2
from user_info ui left join practice_record pr using (uid)
where level in (6,7)
group by uid,d2) t1
group by uid
) T2 using (uid) left join (
select uid,count(distinct if(year(er.start_time) = 2021,date_format(er.start_time,'%y%m%d'),null)) act_days_2021_exam,count(distinct if(year(pr.submit_time) = 2021,date_format(pr.submit_time,'%y%m%d'),null)) act_days_2021_question
from user_info ui left join exam_record er using (uid)
left join practice_record pr using (uid)
group by uid
) T3 using (uid)
order by act_month_total desc ,act_days_2021 desc
/*
最终组合只需要注意1、2表连接使用右外连接即可,因为要实现用户等级的筛选
*/

#虽说没看题解,还是本题对我来说还是有点难了,耗费的时间很长,但是确实学到了不少东西,下次继续加油!!!奥里给
#mysql#
全部评论

相关推荐

无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点??? 还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力………… 感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务