题解 | #每个6/7级用户活跃情况#
每个6/7级用户活跃情况
https://www.nowcoder.com/practice/a32c7c8590324c96950417c57fa6ecd1
这道题我一开始想的时候,不知道怎样才能够找出不重复的月份,天数。
参考了大神的解法。
在子查询中:
- 就是先对exam_record表和practice_record表进行时间选择,还有时间提取。在这一步当中保留year。
- 有一步做得十分巧妙,就是给新增加一个列叫做tag,用于外层查询中分别进行选择。
在外层查询中:
- 对用户条件进行筛选 level >=6
- 对时间进行进一步的筛选,选择2021年
需要注意的点到底用哪个时间:submit_time, start_time, 2021年对应的哪个,这点我开始觉得很乱,这也是做不出来的原因。
- 在exam_record表中,start_time是act_time活跃时间
- 但是在practice_record表中,submit_time是act_time活跃时间
在外层查询中,我们要针对act_time进行2021年的条件筛选。
select
user_info.uid as uid,
count(distinct act_month) as act_month_total,
count(
distinct case
when year (act_time) = 2021 then act_day
end
) as act_days_2021,
count(
distinct case
when year (act_time) = 2021
and tag = 'exam' then act_day
end
) as act_days_2021_exam,
count(
distinct case
when year (act_time) = 2021
and tag = 'question' then act_day
end
) as act_days_2021_question
from
user_info
left join (
select
uid,
start_time as act_time,
date_format (start_time, '%Y%M') as act_month,
date_format (start_time, '%Y%M%D') as act_day,
'exam' as tag
from
exam_record
union all
select
uid,
submit_time as act_time,
date_format (submit_time, '%Y%M') as act_month,
date_format (submit_time, '%Y%M%D') as act_day,
'question' as tag
from
practice_record
) as act_info on user_info.uid = act_info.uid
where
user_info.level >= 6
group by
user_info.uid
order by
act_month_total desc,
act_days_2021 desc

