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

2021-10-17 18:30:34 字數 2792 閱讀 2922

問題描述

有乙個用來記錄每日客戶消耗資料的表 t,它的表結構如下:

要求:統計出頭部客戶、腰部客戶、尾部客戶在上個月(2020-06-01 ~ 2020-06-30)的留存情況。

輸出結果的格式:

資料定義:頭部客戶:上個月消耗金額大於等於 30000 的客戶;

腰部客戶:上個月消耗金額在 10000 ~ 30000(不包含30000)的客戶;

尾部客戶:上個月消耗金額小於 10000 的客戶;

留存:最近兩個月(上個月和本月)消耗金額大於 0 的客戶;

解決方案

下面我將用 cte 來演示每個步驟。

第一步,計算出上個月每個客戶的消耗金額。

with t1 as

(select

customer_id,

sum(amount) as amount

from

twhere created_day between '2020-06-01'

and '2020-06-30'

group by customer_id)

select * from t1

第二步,在第一步的基礎上,統計頭部客戶、腰部客戶、尾部客戶的數量。

t2 as

(select

case

when amount >= 30000

then 1

when amount >= 10000

then 2

else 3

end as customer_level,

count(*) as customter_cnt

from

t1group by customer_level)

select * from t2

在指令碼中使用** 1、2、3 分別表示頭部客戶、腰部客戶、尾部客戶。

需要注意的是,在 group by 子句中使用了 select 子句中的字段別名 customer_level,這種語法在 mysql 上能編譯通過,在其它資料庫中則不行。

第三步,計算留存。根據留存的定義,只要客戶在本月中有消耗,就計入留存數。比如客戶 a,a 在上個月的消耗金額是 40000,那麼 a 屬於頭部客戶,假如 a 在本月的消耗金額大於 0,a 就為【留存】貢獻了 1 。

我們在 t1 之後插入表示式 t12,t12 用來計算每個客戶的消耗金額和留存狀態,它的指令碼如下:

t12 as

(select

t1.customer_id,

t1.amount,

if(tmp.amount > 0, 1, 0) as keep_state

from

t1left join

(select

customer_id,

sum(amount) as amount

from

twhere created_day between '2020-07-01'

and '2020-07-31'

group by customer_id) tmp

on tmp.customer_id = t1.customer_id)

select * from t12

t12 中的左連線也可以改造成標量子查詢。

完整的 sql 實現:

with t1 as

(select

customer_id,

sum(amount) as amount

from

twhere created_day between '2020-06-01'

and '2020-06-30'

group by customer_id),

t12 as

(select

t1.customer_id,

t1.amount,

if(tmp.amount > 0, 1, 0) as keep_state

from

t1left join

(select

customer_id,

sum(amount) as amount

from

twhere created_day between '2020-07-01'

and '2020-07-31'

group by customer_id) tmp

on tmp.customer_id = t1.customer_id),

t2 as

(select

case

when amount >= 30000

then 1

when amount >= 10000

then 2

else 3

end as customer_level,

count(*) as customter_cnt,

sum(keep_state) as keep_cnt

from

t12group by customer_level)

select

case

customer_level

when 1

then '頭部客戶'

when 2

then '腰部客戶'

else '尾部客戶'

end as '層級',

customter_cnt as '客戶數量',

keep_cnt as '留存數量'

from

t2order by customer_level

感興趣的朋友可以嘗試不使用左連線或者標量子查詢的寫法,而是只查一次 t 表就能實現需求。

sql計算留存 SQL 使用者月留存率

sql 使用者月留存率 sql資料分析 6月4日sql 使用者月留存率 需求背景 根據訂單表,統計每個月在接下來幾個月使用者複購情況 如 5月下單使用者10000人 這10000人又在6月又下單的使用者有5000人,這10000人在7月下單的使用者有8000人 解析思路 核心 資料預處理 使用者,月...

mysql 留存率 用mysql統計留存率

分析中留存是個非常重要的指標,很多資料分析平台都提供留存資料的web端展現服務 那麼,如何基於乙個使用者行為表,用mysql得到留存資料呢?基於乙個日常的使用者行為表 比如登陸,測量等 用mysql直接求得使用者的留存情況 這是我一直想做的一件事,之前一直沒有好的方案,直到這次成功實踐了一次。我的分...

mysql統計使用者七日留存儲存過程

begin declare i int declare numareaid int 10 declare currentareaid int 10 select count areaid min areaid into a,b from option area info set numareaid ...