mysql 留存 如何用SQL做留存率分析

2021-10-18 01:27:27 字數 3359 閱讀 5796

背景

留存率計算方法

假如今天新增了100名使用者,第二天登陸了50名,則次日留存率為50/100=50%,第三天登入了30名,則第二日留存率為30/100=30%,以此類推。

用sql的計算思路

用sql調取出user_id和使用者login_time的表,獲得新增使用者登入時間表。

根據user_id和login_time,增加一列first_day,此列存著每個使用者最早登入時間。

有了最早登入時間和所有的登入時間,再增加一列by_day,這一列是用login_time - first_day ,得到0,1,2,3,4,5......,這就得到了某一天登入離第一次登入有多長時間。

獲得乙個這樣的表

然後從表中提取資料,找到first_day對應的with_first列中0有多少個,1有多少個,一直到7以上。

最後獲得這個表

根據此表,就很容易計算出每天引流的留存率。

實際操作

資料:是我用excel隨便模擬的資料,與真實情況不符。

模擬資料

資料庫:mysql

步驟一:從資料庫中提取出user_id和login_time並排序

select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2;

獲得資料

步驟二:增加一列first_day,儲存每個使用者id最早登入時間

select

b.user_id,

b.login_time,

c.first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2) b

left join

(select ---找到user_id對應的最早登入時間,然後匹配帶登入時間的user_id

user_id,

min(login_time) first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2) a

group by 1) c

on b.user_id = c.user_id

order by 1,2;

得到first_day列

步驟三:用登入時間-最早登入時間得到一列by_day

select

user_id,

login_time,

first_day,

datediff(login_time,first_day) as by_day

from

(select

b.user_id,

b.login_time,

c.first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2) b

left join

(select

user_id,

min(login_time) first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2) a

group by 1) c

on b.user_id = c.user_id

order by 1,2) e

order by 1,2

得到by_day

最後一步:提取字段作為列名

select

first_day,

sum(case when by_day = 0 then 1 else 0 end) day_0,

sum(case when by_day = 1 then 1 else 0 end) day_1,

sum(case when by_day = 2 then 1 else 0 end) day_2,

sum(case when by_day = 3 then 1 else 0 end) day_3,

sum(case when by_day = 4 then 1 else 0 end) day_4,

sum(case when by_day = 5 then 1 else 0 end) day_5,

sum(case when by_day = 6 then 1 else 0 end) day_6,

sum(case when by_day >= 7 then 1 else 0 end) day_7plus

from

(select

user_id,

login_time,

first_day,

datediff(login_time,first_day) as by_day

from

(select

b.user_id,

b.login_time,

c.first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from user_info

group by 1,2) b

left join

(select

user_id,

min(login_time) first_day

from

(select

user_id,

str_to_date(login_time,'%y/%m/%d') login_time

from

user_info

group by 1,2) a

group by 1) c

on b.user_id = c.user_id

order by 1,2) e

order by 1,2) f

group by 1

order by 1

最終資料

結語根據最後得到的資料,我們直接用除法或者加乙個sql語句,就能算出來留存率,之後的分析就是看自己了。

參考部落格

mysql統計使用者留存 SQL 統計使用者留存

問題描述 有乙個用來記錄每日客戶消耗資料的表 t,它的表結構如下 要求 統計出頭部客戶 腰部客戶 尾部客戶在上個月 2020 06 01 2020 06 30 的留存情況。輸出結果的格式 資料定義 頭部客戶 上個月消耗金額大於等於 30000 的客戶 腰部客戶 上個月消耗金額在 10000 3000...

如何用Redis做LRU Cache

lru least recently used 最近最少使用演算法是眾多置換演算法中的一種。redis中有乙個maxmemory概念,主要是為了將使用的記憶體限定在乙個固定的大小。redis用到的lru 演算法,是一種近似的lru演算法。上面已經說過maxmemory是為了限定redis最大記憶體使...

在sql中的應用,留做參考

18.2 使用 操作符 在oracle 9i之前,執行外連線的時候,都是使用 來完成的。雖然現在仍舊可以使用 操作符 執行外連線操作,但oracle開始建議使用outer join執行外連線,以使得和標準sql相容。注意1 只能出現在where子句中,並且不能與outer join 也就是left ...