mysql 留存率 用mysql統計留存率

2021-10-17 12:57:04 字數 1507 閱讀 3112

分析中留存是個非常重要的指標,很多資料分析平台都提供留存資料的web端展現服務

那麼,如何基於乙個使用者行為表,用mysql得到留存資料呢?

基於乙個日常的使用者行為表(比如登陸,測量等),用mysql直接求得使用者的留存情況

這是我一直想做的一件事,之前一直沒有好的方案,直到這次成功實踐了一次。

我的分析按照月留存進行,掌握原理後,你可以輕鬆的改為日留存或周留存。

以下是總體思路的乙個思維導圖:

基礎只要一張明細的測量表,記錄使用者每天的測量情況,包含使用者sn測量值和測量時間等 table bak

總體的思路就是:

要得到一張最終的核心表,留存分析的sql**,可以直接基於這個表執行

tmp_pressure_mea_detail,這個表包含所有需要分析的月份情況,比如2023年1月到2023年12月,使用者數是1萬,這個表就會有12萬行資料.

month ,terminal_sn ,mea_cnt, first_mea_month ,diff_month_first_mea_month

月份,使用者sn(使用者的唯一標識),該月份的測量次數,diff_month_first_mea_month(當前月份是該使用者開始測量月份後的第幾個月,)

2017-07, sn001, 13 , 2017-01 ,7

就是指,2023年7月份,使用者sn001的測量次數是13次,他開始測量的月份是2017-01,這個月份是他開始測量後的第7個月

當然過程中,會有一些小問題,都需要乙個個解決,因為要得到這個最終的核心表,先需要建立幾個其他的過程表,特別是t3 cross join的應用

以下**表示:

每個月的月份,開始測量的使用者數,第二個月的留存數,留存率

其他月份,只需要修改diff_month_first_mea_month 的值即可

select first_mea_month ,count(distinct(terminal_sn)) as mea_pat_cnt

, sum(if(diff_month_first_mea_month = 2 and mea_cnt >0,1,0)) as 2ed_retenion_cnt

, concat(round( (sum(if(diff_month_first_mea_month = 2 and mea_cnt >0,1,0)) / count(distinct(terminal_sn))) * 100,0),'%') as retent

from

( select *

from analysis.tmp_pressure_mea_detail

where diff_month_first_mea_month > 0

and mea_cnt is not null -- 等同於mea_cnt > 0

order by terminal_sn ,month

) aa

group by first_mea_month

完整的**之前一直是免費的,碰到太多連個贊都不點的伸手黨,

所以完整的sql**,5元有償分享了。

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

背景 留存率計算方法 假如今天新增了100名使用者,第二天登陸了50名,則次日留存率為50 100 50 第三天登入了30名,則第二日留存率為30 100 30 以此類推。用sql的計算思路 用sql調取出user id和使用者login time的表,獲得新增使用者登入時間表。根據user id和...

MySQL 使用儲存過程實現留存率

delimiter use resourcemanage dev drop procedure if exists stat remain player create definer root localhost procedure stat remain player begin 今天的日期 de...

Mysql求留存率(困難) 遊戲玩法分析

column name type player id intdevice id intevent date date games played int player id,event date 是此表的主鍵,這張表顯示了某些遊戲的玩家的活動情況。每一行是乙個玩家的記錄,他在某一天使用某個裝置登出之前...