题解 | #统计活跃间隔对用户分级结果#
连续签到领金币
http://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
这题我觉得难的还是划分问题,主要求的是和时间相关,那么就找出人的时间,并且和计算有关的时间,和划分有关的时间项目,其中
- Jt:今天,也就是最近的一天
- max_ti:该用户最近一次上线的时间
- min_ti:用户最早上线的一次时间
我觉得这道题目没什么好解释那个点的了,都是一些基础的东西,只是没搞清楚要如何去联系到一个地方,为什么这样划分需要解释一下。
- 忠实用户:就是今天和上一次登录的那天时差要小于6,但是这样有可能是新用户,所以还有和他的第一次登录做一个diff,并且这个时差要大于6,这样才能说明他不是新用户
- 新用户:这个恰好和忠实用户反过来。
- 沉睡用户:这里我卡壳了一下,最后回到宿舍想了一下才想出来,就是今天和最近一次登录的时间要大于6,并且今天和某一次登录的时间要小于29。我一开始写的是jt和某一次的登录时间要大于6,没通过,后来我想了一下觉得这样可能某一位有多条登录记录的忠实用户如果恰好也有一条记录是满足这个情况的,那么那条记录也会被打上沉睡用户的标签,之后那位用户就会被记录为沉睡用户和忠实用户。*(具体我是怎么发现这个错误的呢?就是观察错误的四个数据发现,其他三个和原数据相对减少了一些,只有第三个数据是相对增加的,所以我就判断是这个数据发生了错误,我就在他上面修改了一下,然后就通过了。)
- 流失用户 :这个挺好判断的
这些项目也是我逐渐写的过程中才发现和划分有关的,我自己比较菜,就都是做了窗口函数去取出数据,还是边在sql里面做表格来查阅该如何去做划分和取数。
写这题的时候还是没搞清如何划分,是看着上一道题目对新用户的划分来写的,感觉自己没什么成长。而且写这题的时候还有些困,但是从9点开始带上耳机边听歌边写,居然一鼓作气的一直在写,还没有分心,就连教学楼熄灯了,都还检测了几下代码,看看能不能通过。
# 先用户划分 再 分别统计出ratio
# 但是我发现我还是不会划分新用户 并且取出非新用户
# 好像又懂了 新用户好像是指那些 近七天刚出现过的,并且之前没有出现过的人
with t3 as
(
select if(datediff(jt,in_time) <= 6 and datediff(jt,min_ti) > 6 ,'忠实用户',
if(datediff(jt,in_time) <= 6 and datediff(jt,min_ti) <= 6,'新晋用户',
if(datediff(jt,max_ti) > 6 and datediff(jt,in_time)<= 29,'沉睡用户',
if(datediff(jt,max_ti) > 29 ,'流失用户',null)))) as user_grade,
count(distinct uid) as ra
from
(
select *,
max(in_time) over(partition by uid) as max_ti,
min(in_time) over(partition by uid) as min_ti
from (
select *,
max(in_time) over() as jt
from tb_user_log
) t1
)t2
group by user_grade
having user_grade is not null
)
select user_grade,
round(ra / (select sum(ra) as ratio
from t3) , 2) as ratio
from t3