題目:
牛客每天有很多人登錄,請你統計一下牛客每個日期新用戶的次日留存率。
有一個登錄(login)記錄表,簡況如下:
第1行表示id為2的用戶在2020-10-12使用了客戶端id為1的設備登錄了牛客網,因為是第1次登錄,所以是新用戶
。。。
第4行表示id為2的用戶在2020-10-13使用了客戶端id為2的設備登錄了牛客網,因為是第2次登錄,所以是老用戶
。。
最后1行表示id為4的用戶在2020-10-15使用了客戶端id為1的設備登錄了牛客網,因為是第2次登錄,所以是老用戶
請你寫出一個sql語句查詢每個日期新用戶的次日留存率,結果保留小數點后面3位數(3位之后的四舍五入),並且查詢結果按照日期升序排序,上面的例子查詢結果如下:
查詢結果表明:
2020-10-12登錄了3個(id為2,3,1)新用戶,2020-10-13,只有2個(id為2,1)登錄,故2020-10-12新用戶次日留存率為2/3=0.667;
2020-10-13沒有新用戶登錄,輸出0.000;
2020-10-14登錄了1個(id為4)新用戶,2020-10-15,id為4的用戶登錄,故2020-10-14新用戶次日留存率為1/1=1.000;
2020-10-15沒有新用戶登錄,輸出0.000;
(注意:sqlite里查找某一天的后一天的用法是:date(yyyy-mm-dd, '+1 day'),sqlite里1/2得到的不是0.5,得到的是0,只有1*1.0/2才會得到0.5)
程序:
SELECT a.date, ROUND(COUNT(b.user_id) * 1.0/COUNT(a.user_id), 3) AS p FROM ( SELECT user_id, MIN(date) AS date FROM login GROUP BY user_id) a LEFT JOIN login b ON a.user_id = b.user_id AND b.date = date(a.date, '+1 day') GROUP BY a.date UNION SELECT date, 0.000 AS p FROM login WHERE date NOT IN ( SELECT MIN(date) FROM login GROUP BY user_id) ORDER BY date;