题解 | #每个6/7级用户活跃情况#
每个6/7级用户活跃情况
https://www.nowcoder.com/practice/a32c7c8590324c96950417c57fa6ecd1
题目:
统计每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,按照总活跃月份数、2021年活跃天数降序排序
思路:
1、找到每个6/7级用户 —— 表user_info
2、找到用户所有活跃的时间(包括试卷和练习),想到用group by + count,但是前提必须是试卷和练习时间在一列里,想到用union ——表a
3、统计总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数这四列肯定是要用到date_format()函数,所以可以提前将活跃年、活跃月份、活跃天找出来 —— 表b
4、在表b的结果中,用group by + count(加条件)查询
注意:一开始在表a中用的是uid in (level67),这样的话1003用户就被忽略了,他没有作答,所以在a中必须使用左连接,将ui表作为主表
答案:
with a as ( select uid, exam_id as tid, submit_time, 'er' as title from ( select uid from user_info where level in (6, 7) ) ssu left join exam_record using(uid) union select uid, question_id as tid, submit_time, 'pr' as title from ( select uid from user_info where level in (6, 7) ) ssu left join practice_record using(uid) ) select uid ,count(distinct act_month) as act_month_total ,count(distinct (case when act_year =2021 then act_day end)) as act_days_2021 ,count(distinct (case when act_year =2021 and title = 'er' then act_day end)) as act_days_2021_exam ,count(distinct (case when act_year =2021 and title = 'pr' then act_day end)) as act_days_2021_question from ( select *, year(submit_time) as act_year, date_format(a.submit_time, '%Y%m') as act_month, date_format(a.submit_time, '%Y%m%d') as act_day from a ) b group by uid order by act_month_total desc,act_days_2021 desc