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

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

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

此题共包含一张表:

表1:tb_user_log

要解决的问题:

问题:统计活跃间隔对用户分级后,各活跃等级用户占比,结果保留两位小数,且按占比降序排序。

用户等级标准简化为:

  • 忠实用户(近7天活跃过且非新晋用户)、
  • 新晋用户(近7天新增)、
  • 沉睡用户(近7天未活跃但更早前活跃过)、
  • 流失用户(近30天未活跃但更早前活跃过)。
  • 假设今天就是数据中所有日期的最大值。
  • 近7天表示包含当天T的近7天,即闭区间[T-6, T]。

解题思路:

  1. 先计算每一条数据与max(in_time)的时间间隔
  2. 根据时间间隔做when case判断,得到各个UID的用户等级
  3. 根据用户等级,计算各等级所占比例,且结果保留两位小数
  4. 按占比的降序排序

知识点:

  1. 在做grade分组时,一定要先获取min(gap) 和 max(dt) 否则获取的结果会有问题

select grade,
	   ROUND(count(grade) / (SELECT count(DISTINCT uid) from tb_user_log),2) ratio
from(
		select uid, 
              case when gap <7 and dt != 1 then '忠实用户'
              when gap < 7 and dt = 1 then '新晋用户'
              when gap >= 7 and gap < 30 then '沉睡用户'
              when gap >= 30 then '流失用户'
              END as grade
		FROM(
            select uid,min(gap) as gap,max(dt) as dt
            from(
              select uid,
              TIMESTAMPDIFF(day,in_time,(SELECT max(in_time) from tb_user_log)) gap,
              count(*) over (PARTITION by uid ORDER BY in_time) dt
              from tb_user_log
            	) gap_table
		GROUP by uid)  uid_name_table
	)info
GROUP by grade
order by ratio desc,grade
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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