题解 | #牛客每个人最近的登录日期(三)#,两种解法,三个函数

牛客每个人最近的登录日期(三)

http://www.nowcoder.com/practice/16d41af206cd4066a06a3a0aa585ad3d

本题的重点在于如何求第二天登录的用户,看了很多答案,思路都大差不差,这里给出了两个方法看各位的理解

方法一

留存率=第二天登录的用户/总用户

第二天登录的用户就是我们需要求的,而总用户就简单了,考虑到用户重复性的问题,使用去重

select count(distinct user_id) from login

保留三位小数就简单了 round(,3)

求第二天依旧登录的用户,我提供了三种函数,大家看自己喜好 分别是 min 开窗求最小日期、lead/lag连续函数,对于求连续登录的问题,使用起来非常灵活

            (select count(distinct user_id) from login ),3
            )
from
(select user_id,date,min(date) 
       over (partition by user_id) as firstday from login)a 
where datediff(date,firstday)=1
 #或 lead函数
# (select user_id,date,lead(date,1) 
#      over (partition by user_id) as firstday from login)a 
# where datediff(firstday,date)=1
 # lag函数
# (select user_id,date,lag(date,1) 
#      over (partition by user_id) as firstday from login)a 
# where datediff(date,firstday)=1

方法二

用case when 取代selec后面的子查询,提高代码可读性,同样的 min开窗可以被 lead/lag取代

 SELECT ROUND(SUM(CASE WHEN date-first_date=1 THEN 1 ELSE 0 END)
              / COUNT(DISTINCT user_id), 3) p FROM 
 (SELECT user_id, date,
 MIN(date) OVER(PARTITION BY user_id) first_date FROM login ) t
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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