题解 | #牛客每个人最近的登录日期(三)#,两种解法,三个函数
牛客每个人最近的登录日期(三)
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
查看5道真题和解析