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

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

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

#把6、7级用户的exam_record和practice_record纵向组合在一起,新增一列tp标记试卷和题目
WITH temp AS(
	SELECT ui.uid,'exam' tp,DATE_FORMAT(er.`start_time`,'%Y%m') mon,DATE(er.`start_time`) da
	FROM user_info  ui LEFT JOIN exam_record er 
	ON ui.`uid`=er.`uid`
	WHERE ui.`level`=6 OR ui.`level`=7
	UNION ALL
	SELECT ui.uid,'practice' tp,DATE_FORMAT(pr.submit_time,'%Y%m') mon,DATE(pr.submit_time) da
	FROM user_info  ui LEFT JOIN practice_record pr 
	ON ui.`uid`=pr.`uid`
	WHERE ui.`level`=6 OR ui.`level`=7
	),
	#求6/7级用户总活跃月份数(包括所有年份)
	a AS(
		SELECT uid,COUNT(DISTINCT mon) act_month_total
		FROM temp
		GROUP BY uid
	),
	#求6/7级用户2021年试卷、题目活跃天数,这时标签列tp起了很大作用
	#注意年份筛选不要放WHERE里,会把没有活跃记录的用户误删了
	#比如1003是6/7级用户,在2021年没有活跃记录
	b AS(
		SELECT uid,COUNT(DISTINCT IF(YEAR(da)='2021',da,NULL)) act_days_2021,
		COUNT(DISTINCT IF(tp='exam' AND YEAR(da)='2021',da,NULL)) act_days_2021_examact,
		COUNT(DISTINCT IF(tp='practice' AND YEAR(da)='2021',da,NULL)) act_days_2021_question
		FROM temp
		GROUP BY uid
	)
SELECT a.uid,act_month_total,act_days_2021,act_days_2021_examact,act_days_2021_question
FROM a JOIN b ON a.uid=b.uid
ORDER BY act_month_total DESC,act_days_2021 DESC

全部评论
其实这里共用表表达式a和b可以放一起求,没必要分开,然后直接排序即可 分开是为了让大家关注2021年这一个关键条件
点赞 回复 分享
发布于 2023-08-31 22:53 安徽

相关推荐

点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
07-20 12:08
已编辑
江南大学 图像识别
机械牛马勇闯秋招:把校园经历里面做过的项目,大作业,课设,毕设啥的,扩写,写成具体的项目经历,自我评价缩写别占篇幅,不然这简历真没东西,初筛都过不了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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