题解 | #每个6/7级用户活跃情况#
每个6/7级用户活跃情况
https://www.nowcoder.com/practice/a32c7c8590324c96950417c57fa6ecd1
这个题的表述“总活跃月份数”,“活跃天数”,“年试卷作答活跃天数”我认为应该是指start_time有即可,不管该答题记录的用户是否已经提交,只要有记录,就说明该天活跃。
这里就感觉没必要详细分析,应该都会。只是这种描述可能存在歧义,所以上面一句话谈了谈自己对描述条件的理解。牛客sql的很多题中,有时候作者的描述我感觉是有歧义的。
方法:step1:蛮简单的就是把符合要求的用户记录 找出来,分别用user表left join 答题表、练习表,然后将他们union all起来,同时标记号记录的所属范围,因为后面的分组计算需要用到
step2:group by uid 即可,根据条件统计出不同要求的数据即可,其实这一题我觉得考的是函数的使用吧,我的使用习惯喜欢用case when,当然你爱用啥用啥,因为不同数据库可能会让你养成不同的习惯,sql总是在不同数据引擎中总会有一些差异。
select c.uid,count(distinct date_format(c.time,"%Y%m")) as act_month_total, count(distinct case when year(c.time)=2021 then date_format(c.time,"%Y%m%d") else null end ) as act_days_2021, count(distinct case when (year(c.time)=2021 and c.tag='exam_record') then date_format(c.time,"%Y%m%d") else null end ) as act_days_2021_exam, count(distinct case when (year(c.time)=2021 and c.tag='practice_record') then date_format(c.time,"%Y%m%d") else null end ) as act_days_2021_question from ( ( select a.uid,b.start_time as time ,"exam_record" as tag from user_info a left join exam_record b on a.uid = b.uid where a.level = 6 or a.level = 7 ) union all ( select a.uid,b.submit_time as time ,"practice_record" as tag from user_info a left join practice_record b on a.uid = b.uid where a.level = 6 or a.level = 7 ) ) c group by c.uid order by act_month_total desc,act_days_2021 desc