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

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

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

分步处理合并找优化

自己蒙头写了大半天,还是要借鉴、学习思想。

6/7级用户

from user_info 
where ui.level >5

用户总活跃月份数

里面包含了两个表,所以我们将两表需要的数据取出来并合并,然后进行分组统计个数

select uid, count(distinct s) as act_month_total from (
	select uid,DATE_FORMAT(submit_time,'%Y%m') as s from practice_record pr
	union all
	SELECT uid,DATE_FORMAT(start_time,'%Y%m') as s from exam_record er
)t
group by uid

2021年活跃天数

还是需要将两表合并然后加上2021年的限制

select uid,count(distinct s) as act_days_2021 from (
	select uid,DATE_FORMAT(submit_time,'%m%d') as s from practice_record pr
		where year(submit_time)=2021
	union all 
	select uid,DATE_FORMAT(start_time,'%m%d') as s from exam_record er
    	where year(submit_time)=2021
)t1
group by uid

2021年试卷作答活跃天数

需要用到试卷表的按天统计

select uid,count(distinct date_format(start_time,'%m%d')) as act_days_2021_exam 
from exam_record 
where year(start_time)=2021 
group by uid

2021年答题活跃天数

需要用到答题表的按天统计

select uid,count(distinct date_format(submit_time,'%m%d')) as act_days_2021_question 
from practice_record 
where year(submit_time)=2021

简化

我们可以看到每一步都用到了相同的代码:

  1. 第一个用到了 年月 进行统计;
  2. 在后三个都用到的 月日 进行统计
  3. 有的需要2指定021年

结论

  • 所以我们在提取数据的时候将 年月日 一并提取出来;
  • 因为后面要区分两个表的数据(答题和试卷)所以添加一个tag标志分别表示两表
  • 与用户表右连接以显示所有6、7级的用户,最后分组排序

注意:

  1. union all 需要两表列数相同,并且两表不需要多余的括号;
  2. 题目中需要全部展示6、7级的用户,需要用到left join 或right join,连接后相同字段名前指定表名;
  3. 如使用group by 那么select 后前面的字段必须的聚合函数或者是分组字段
  4. 年份条件不是每一个字段都需要,所以加到if里面统计
select 
    ui.uid,
    count(distinct left(s,6)) as act_month_total,
    count(distinct if(left(s,4)='2021',right(s,4),null)) as act_days_2021,
    count(distinct if(left(s,4)='2021' and tag='e',right(s,4),null)) as act_days_2021_exam,
    count(distinct if(left(s,4)='2021' and tag='p',right(s,4),null)) as act_days_2021_question
from (
        select uid,DATE_FORMAT(submit_time,'%Y%m%d') as s,'p' tag from practice_record pr
        union all
        SELECT uid,DATE_FORMAT(start_time,'%Y%m%d') as s,'e' as tag from exam_record er 
)mon
right join user_info ui
on ui.uid = mon.uid
where ui.level >5
group by uid
order by act_month_total DESC,act_days_2021 desc
全部评论
点赞 回复 分享
发布于 2022-11-17 13:00 江苏
妙啊
点赞 回复 分享
发布于 2022-11-06 14:56 四川
简化好多!厉害!
点赞 回复 分享
发布于 2022-09-17 17:02 天津
思路清晰!🐂
点赞 回复 分享
发布于 2022-08-26 14:32 安徽
请问这里的TAG是什么意思,怎么用的呀
点赞 回复 分享
发布于 2022-03-23 07:27

相关推荐

04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
17
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务