题解 | #统计活跃间隔对用户分级结果#

统计活跃间隔对用户分级结果

http://www.nowcoder.com/practice/6765b4a4f260455bae513a60b6eed0af

思路: 我的思路是通过“今日与最晚活跃日期时间差”和“今日与最早活跃日期时间差”共同来确定用户的等级,所以首先生成一个表a,主要包含三个字段:uid,今日与最晚活跃日期时间差,今日与最早活跃日期时间差:

select uid,
       datediff((select max(out_time) from tb_user_log),max(out_time)) as 今日与最后活跃日时间差,
       datediff((select max(out_time) from tb_user_log),min(in_time)) as 今日与最早活跃日时间差
       from tb_user_log
       group by uid;

运行结果如下: alt 然后,判断的逻辑如下:如果今日与最后活跃日时间差大于29天(包含今日在内),那么必然是流失用户;如果今日与最后活跃日时间差小于等于29天但大于等于7天,那么必然是沉睡用户;如果今日与最后活跃日时间小于等于6天,则如果“今日与最晚活跃日期时间差”和“今日与最早活跃日期时间差”相等说明是新晋用户,不相等说明是忠实用户,因此从之前建立的表a中可以提取设置新变量用户等级:

select uid,
		case when 今日与最后活跃日时间差 > 29 then '流失用户'
			 when 今日与最后活跃日时间差 <= 29 and 今日与最后活跃日时间差 >= 7 then '沉睡用户'
             when 今日与最后活跃日时间差 <= 6 and 今日与最后活跃日时间差 = 今日与最早活跃日时间差 then '新晋用户'
             else '活跃用户' end as 用户分级
		from
(select uid,
       datediff((select max(out_time) from tb_user_log),max(out_time)) as 今日与最后活跃日时间差,
       datediff((select max(out_time) from tb_user_log),min(in_time)) as 今日与最早活跃日时间差
       from tb_user_log
       group by uid) as a

结果如下: alt 最后我们从上表中提取比例:

select 用户分级,
	round(count(uid)/(select count(distinct uid) from tb_user_log),2) as 比例
    from
		(select uid,
			case when 今日与最后活跃日时间差 > 29 then '流失用户'
			 when 今日与最后活跃日时间差 <= 29 and 今日与最后活跃日时间差 >= 7 then '沉睡用户'
             when 今日与最后活跃日时间差 <= 6 and 今日与最后活跃日时间差 = 今日与最早活跃日时间差 then '新晋用户'
             else '忠实用户' end as 用户分级
		from
			(select uid,
       			datediff((select max(out_time) from tb_user_log),max(out_time)) as 今日与最后活跃日时间差,
       			datediff((select max(out_time) from tb_user_log),min(in_time)) as 今日与最早活跃日时间差
       		from tb_user_log
      	 group by uid) as a) as b
     group by 用户分级
     order by 比例 desc;
全部评论
这个答案是我感觉写的最好的
2 回复 分享
发布于 2022-07-07 15:17
近7天的新晋客户:我的理解是首次登录日期(最早活跃日期)在近7天内,博主判断标准是7天内今日与最后活跃日时间差 = 今日与最早活跃日时间差。总感觉哪里不对啊
1 回复 分享
发布于 03-14 15:33 上海
select 用户分级, round(count(uid)/(select count(distinct uid) from tb_user_log),2) as 比例 from ( select uid, case when early_dt >= date_sub(today,interval 6 day) then '新晋用户' when latest_dt >= date_sub(today,interval 6 day) then '忠实用户' when latest_dt >= date_sub(today,interval 29 day) and latest_dt < date_sub(today,interval 6 day) then '沉睡用户' when latest_dt < date_sub(today,interval 29 day) then '流失用户' end) '用户分级' from ( select uid,max(date(out_time)) latest_dt,min(date(in_time)) early_dt from tb_user_log group by uid ) t1 ) t2 group by 用户分级 order by 比例 desc
1 回复 分享
发布于 2022-08-18 17:25 上海
你这是我翻到感觉最巧妙的
点赞 回复 分享
发布于 06-29 11:44 美国
新晋用户只要保证最早登录时间与今天时间差<=6就行了
点赞 回复 分享
发布于 2024-09-01 03:12 上海
select uid, datediff(select max(date(out_time)) from tb_user_log ,min(date(in_time)) ) as 今日与最早活跃日时间差, datediff(select max(date(out_time)) from tb_user_log ,max(date(in_time)) ) as 今日与最近活跃日时间差 from tb_user_log group by uid 这个语句当中为何不能出现date()函数?
点赞 回复 分享
发布于 2023-02-16 20:00 北京
新晋用户是不是只活跃过一次,也就是登录的那一次,所以出现了:最后活跃时间=最早活跃时间 and 今日与最后活跃日时间差 <= 6
点赞 回复 分享
发布于 2023-02-16 19:45 北京
好像有点小问题?比如11.4日是今天,假设用户102只在11.3和11.4登录过两次其余时间没有登录过,那么今日与最后活跃日时间差 =0 ,今日与最早活跃日时间差=1,此时when 今日与最后活跃日时间差 <= 6 and 今日与最后活跃日时间差 != 今日与最早活跃日时间差 。但他仍然是新晋用户。因为是在近7天首次登录的,只是近7天频繁登录了多次、
点赞 回复 分享
发布于 2023-02-05 14:49 北京
棒!!!!总算是看懂了代码,前面那些答案绕的要死。搞不清楚
点赞 回复 分享
发布于 2022-08-13 15:01

相关推荐

代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
51
6
分享

创作者周榜

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