题解 | #每个6/7级用户活跃情况#
每个6/7级用户活跃情况
https://www.nowcoder.com/practice/a32c7c8590324c96950417c57fa6ecd1
1. 一开始想到的 功能查询,用的user_info表左关联查询exam_record 和左关联查询practice_record ,通过 uid的level 6-7级作为限制条件 和uid分组得到 uid 的 总活跃月份数,2021年总活跃天数,2021年试卷作答活跃天数,2021年答题区活跃天数,后面想来,这样写法没有考虑到2021年 活跃日期的去重问题。遂采用第二种方法。第二种方法的功能属于是,先各自统计试卷活跃月份天数,和答题区活跃月份天数,然后使用union all 得到全部的纪录并使用exam和question标志位来标识是试卷区还是答题区。最后通过Uid和if函数判断得到所有的结果。
/**select UI.uid,
count(distinct date_format(ER.start_time,'%Y%m')) + count(distinct date_format(PR.submit_time,'%Y%m')) act_month_total,
(count(distinct if(year(ER.start_time)=2021,date_format(ER.start_time,'%Y%m%d'),null)) +
count(distinct if(year(PR.submit_time)=2021,date_format(PR.submit_time,'%Y%m%d'),null))) act_days_2021 ,
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 on UI.uid = ER.uid
left join practice_record PR on UI.uid = PR.uid
where UI.level between 6 and 7
group by UI.uid
order by act_month_total desc,act_days_2021 desc ;
**/
select C.uid,
count(distinct C.month_time) act_month_total,
count(distinct C.act_day_time) act_days_2021,
count(distinct if(tag='exam',C.act_day_time,null)) act_days_2021_exam,
count(distinct if(tag='question',C.act_day_time,null)) act_days_2021_question
from (
select UI.uid,
date_format(ER.start_time,'%Y%m') month_time ,
if(year(ER.start_time)=2021,date_format(ER.start_time,'%Y%m%d'),null) act_day_time ,
if(year(ER.start_time)=2021,'exam','exam_') tag
from user_info UI left join exam_record ER on UI.uid = ER.uid
where UI.level in (6,7)
union all
select UI.uid ,
date_format(PR.submit_time,'%Y%m') month_time ,
if(year(PR.submit_time)=2021,date_format(PR.submit_time,'%Y%m%d'),null) act_day_time,
if(year(PR.submit_time)=2021,'question','question_') tag
from user_info UI left join practice_record PR on UI.uid = PR.uid
where UI.level in (6,7)
) C group by C.uid
order by act_month_total desc,act_days_2021 desc ;

