题解 | #牛客每个人最近的登录日期(三)#
牛客每个人最近的登录日期(三)
http://www.nowcoder.com/practice/16d41af206cd4066a06a3a0aa585ad3d
/* 首先要找到新登录的日期,应该为最小的那个日期; 其次利用日期差为1的限制条件判断第二次登陆是否为第二天; 分母应该是count(distinct user_id)---客户人数 */
/* 先取出离第一次登陆最近的那一次登陆的记录作为,时间为second_date; 开窗函数的dense_rank()可以避免在第一天登陆两次造成的二次登录错觉,直接把除开第一天登陆的第二次登陆记号为2 */
SELECT ROUND(SUM(if_save)/count(DISTINCT user_id),3) as p
FROM (select t1.user_id,date,
(case when TIMESTAMPDIFF(DAY,t1.date,t2.second_date)=1 then 1 else 0 end) as if_save
from login t1
left JOIN
(SELECT t4.user_id,t4.second_date FROM
(SELECT t3.user_id,t3.date as second_date,
DENSE_RANK() over(partition by t3.user_id order by t3.date ) as rank_num
from login t3)t4
WHERE t4.rank_num=2)t2
ON t1.user_id=t2.user_id
) t;
