SQL練習題44:牛客每天有很多人登錄,請你統計一下牛客每個日期新用戶的次日留存率。


題目:

牛客每天有很多人登錄,請你統計一下牛客每個日期新用戶的次日留存率。
有一個登錄(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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM