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

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

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

【问题分析】 要统计的用户类型涉及两个日期:1、最近活跃日期last_dt;2、注册日期first_dt。其中对每个用户而言,最小的登入日期就是注册日期,而最近活跃日期就是最大登出日期。然后将以上日期与‘今天’日期做差就可以得到最近活跃与注册距离‘今天’的差,于是问题可以转换为:

忠实用户(近7天活跃过且非新晋用户)=last_dt_diff<7 and first_dt_diff>=7

新晋用户(近7天新增)=first_dt_diff<7

沉睡用户(近7天未活跃但更早前活跃过)=last_dt_diff>=7

流失用户(近30天未活跃但更早前活跃过)=last_dt_diff>=30

【问题求解】 第一步:获得每个用户的注册时间、最近活跃时间、‘今天’的日期以及用户总量


select
	distinct
	uid
	,min(date(in_time)) over (partition by uid) as first_dt
	,max(date(out_time)) over (partition by uid) as last_dt
	,max(date(out_time)) over() as cur_dt
	,t1.user_cnt
from tb_user_log
left join 
(select 
	count(distinct uid) as user_cnt
from tb_user_log)  t1 on 1; -- 注意:拼接条件是on 1	

----
+-----+------------+------------+------------+----------+
| uid | first_dt   | last_dt    | cur_dt     | user_cnt |
+-----+------------+------------+------------+----------+
| 101 | 2021-10-01 | 2021-10-01 | 2021-11-04 |        7 |
| 102 | 2021-10-30 | 2021-10-30 | 2021-11-04 |        7 |
| 103 | 2021-10-21 | 2021-10-21 | 2021-11-04 |        7 |
| 104 | 2021-09-03 | 2021-11-02 | 2021-11-04 |        7 |
| 105 | 2021-11-03 | 2021-11-03 | 2021-11-04 |        7 |
| 108 | 2021-09-01 | 2021-11-03 | 2021-11-04 |        7 |
| 109 | 2021-08-31 | 2021-11-04 | 2021-11-04 |        7 |
+-----+------------+------------+------------+----------+
7 rows in set (0.00 sec)

第二步:获得注册与最近活跃日期距离‘今天’的日期差。

select 
	uid
	,user_cnt
	,timestampdiff(day,first_dt,cur_dt) as first_dt_diff
	,timestampdiff(day,last_dt,cur_dt) as last_dt_diff
from	
(
select
    distinct
    uid
    ,min(date(in_time)) over (partition by uid) as first_dt
    ,max(date(out_time)) over (partition by uid) as last_dt
    ,max(date(out_time)) over() as cur_dt
    ,t1.user_cnt
from tb_user_log
left join
(select
    count(distinct uid) as user_cnt
from tb_user_log)  t1 on 1
) t2
----

+-----+----------+---------------+--------------+
| uid | user_cnt | first_dt_diff | last_dt_diff |
+-----+----------+---------------+--------------+
| 101 |        7 |            34 |           34 |
| 102 |        7 |             5 |            5 |
| 103 |        7 |            14 |           14 |
| 104 |        7 |            62 |            2 |
| 105 |        7 |             1 |            1 |
| 108 |        7 |            64 |            1 |
| 109 |        7 |            65 |            0 |
+-----+----------+---------------+--------------+
7 rows in set (0.00 sec)

第三步:统计出结果。最终代码如下:

select
   user_grade
   ,round(count(1)/max(user_cnt),2) as ratio
from
(select
   uid
   ,user_cnt
   ,case
		when last_dt_diff>=30  then '流失用户'
		when last_dt_diff>=7 then '沉睡用户'
       when first_dt_diff<7 then '新晋用户'
 		when last_dt_diff<7 and first_dt_diff>=7 then '忠实用户'    
   end as user_grade
from		
(select 
   uid
   ,user_cnt
   ,timestampdiff(day,first_dt,cur_dt) as first_dt_diff
   ,timestampdiff(day,last_dt,cur_dt) as last_dt_diff
from	
(
select
   distinct
   uid
   ,min(date(in_time)) over (partition by uid) as first_dt
   ,max(date(out_time)) over (partition by uid) as last_dt
   ,max(date(out_time)) over() as cur_dt
   ,t1.user_cnt
from tb_user_log
left join
(select
   count(distinct uid) as user_cnt
from tb_user_log)  t1 on 1
) t2
)t3
) t4
group by user_grade
order by user_grade, ratio desc;
#SQL练习记录#
全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
已经入职数字马力4个月了,忍不住想和大家聊聊最真实的感受!🔥1️⃣&nbsp;岗位偏见?作为蚂蚁的子公司,很多人会担心“内包”身份会不会有岗位偏见。就我这几个月的体验来说,数字马力一直在快速扩招,面试流程也越来越规范(尤其是校招环节)。至于偏见问题,真的看部门和leader,很幸运我遇到的师兄和主管都特别nice,团队氛围很融洽。2️⃣&nbsp;待遇怎么样?试用期工资不打折!这点我真的吹爆💥!每天六点下班还有餐补,公积金按全额8%交(感动哭)……不过养老金也是实打实的8%,到手稍微心疼一下下😂3️⃣&nbsp;技术栈跟得上吗?技术栈多到学不完……而且我们有权限访问蚂蚁的知识库,自学能力强+愿意钻研的话,成长速度真的飞快!(当然,像我这种偶尔偷懒的也在慢慢进步中😝)4️⃣&nbsp;面试流程?一般是三面:两轮技术面(可能有线上笔试)+&nbsp;一轮HR面(含背调)。整体节奏比较顺畅,反馈也及时。5️⃣&nbsp;未来发展怎么看?老实说,数字马力不算头部大厂,不能指望它给简历镀金,但也绝不是那种会“减分”的外包。我更愿意把它看作一个扎实的中厂跳板,适合积累实战经验。6️⃣&nbsp;怎么投递?通过数字马力gzh,今天刚放出一批新HC!如果你正在看机会,不妨试试数字马力~之前面挂过也没关系,不妨再战一次,机会说不定就来了!🤝✅&nbsp;我的专属内推码:NTA6Nvs,可以直接帮大家推进流程。📮&nbsp;有任何关于公司、岗位、面试的问题,也欢迎留言,我会尽量回复~(小声说:大环境不易,希望大家都能找到心仪的工作,也欢迎来找我内推呀!)
数字马力公司福利 22人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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