問題描述
有乙個用來記錄每日客戶消耗資料的表 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 ...