mysql如何只改月份 用mysql統計留存率

2021-10-18 13:36:39 字數 1747 閱讀 6697

分析中留存是個非常重要的指標,很多資料分析平台都提供留存資料的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怎麼改utf mysql如何修改utf8

mysql修改utf8的方法 首先通過 show variables like character set 檢視mysql字符集 然後在mysql安裝目錄下找到my.ini檔案並修改 最後重啟mysql即可。推薦 mysql教程 mysql 5.7版本修改編碼為utf 8 首先通過 show var...

mysql如何只獲取年月日

在我們日常的開發中,可能偶爾是獲取時間的字段來做一些操作,但是有的時候,我們看到的資料是包含具體的時間的。比如 2020 01 13 22 10 23 但是我們有的時候不需要後面的具體到分鐘的精確時間,而只需要前面的年月日,比如 2020 01 13 有的人 肯定會說,直接設定時間型別就可以了,對的...

mysql離散查詢 如何寫出高效能的MySQL查詢

想寫這樣一篇文章很久了,但始終沒有下手。最近幫同事看了幾個查詢,而且自己也在考慮乙個索引系統的問題,所以今天就把這個寫了。介紹一下mysql的索引機制,還有一些mysql查詢的優化策略。鄙人才疏學淺,很可能說的不對,請路過的各位大俠批評指正,獻醜了。首先,說說mysql的索引儲存方式。mysql的索...