為什么寫這么一篇文章呢,因為在之前的基金公司面試,1/50的錄取幾率,很榮幸自己可以打敗這么多候選人,被上海著名某基金公司錄取。有一大半人卡在了筆試環節,就說我自個廠商招的一群小伙伴,在辦公室做題的時候,很多小伙伴直接放棄了,知道自己連筆試都過不了。
而次日留存率,就是其中的第一道筆試題,足以說明它要求面試者的SQL素養之高。
ok,接下來給大家詳解一下本題的思路。
0,題目需求
有一張用戶登錄表(user_login_table),請統計每個日期新用戶的次日留存率。
user_id | client_id | login_date |
1 | A002 | 2024-11-12 |
2 | A005 | 2024-11-12 |
3 | A002 | 2024-11-12 |
1 | A006 | 2024-11-13 |
2 | A001 | 2024-11-13 |
3 | A0009 | 2024-11-14 |
4 | A0008 | 2024-11-14 |
4 | A0007 | 2024-11-15 |
5 | A0249 | 2024-11-15 |
在這里,有一個特別重要的概念,需要跟大家解釋一下:
次日留存率:在一段時間(如第一天)的新增用戶中,在第二天再次成功啟動應用登錄的比例。
1,解題思路
首先,審題之后,總歸是要知道他的一個最終的結果的。
咱把結果數據展示一下:
date | rate_of_next_surv | --計算過程 |
2024-11-12 | 0.667 | (1,2)/(1,2,3) |
2024-11-13 | 0 | / |
2024-11-14 | 0.5 | (4)/(3,4) |
最終的結果,咱只展示date和rate_of_next_surv這兩個字段即可。
date | ratesurv |
2024-11-12 | 0.667 |
2024-11-13 | 0 |
2024-11-14 | 0.5 |
這么得來的呢??
完我們在計算某天留存率的時候,當然是看看下一天,有哪些客戶還存在登錄(當然,就需要客戶去關聯),但是,時間也需要錯位關聯!!!關聯上的,就是留存下來的總人數。
2,解題代碼
--有一張用戶登錄表(user_login_table),請統計每個日期新用戶的次日留存率。--user_id client_id login_date date ratesurvselect count(t1.user_id)--統計當天的所有用戶數,t1.login_date,count(t2.user_id) --統計后一天關聯上的用戶,注意count(字段),會忽略字段的null值,count(t2.user_id)/count(t1.user_id) as ratesurv --次日留存率from user_login_table t1left join user_login_table t2on t1.user_id = t2.user_idand t1.login_date = date_sub(t2.user_id,-1)group by t1.login_date;
上面涉及到兩個重要知識點:
1,屬于表的自關聯,關聯條件,除了用戶,還有時間(錯位關聯)。
2,count(用戶),會忽略字段為null的數據,言外之意,沒有關聯上的,就不統計。
當然,筆試過程中我們保留所需要的字段展示就可以了。
題目不難,但思路很重要。
歡迎一鍵三連,下次再會!