sql计算留存_SQL基础第七讲:关于用户留存率的计算
????最近,好幾個(gè)小伙伴都拿著關(guān)于用戶留存的面試題來問我,所以今天單獨(dú)開一篇文章講一下留存問題。
????首先看一下留存是什么,簡單來說,我和你今天在一家超市購物了,明天我來購物了,你沒來,那么我就是這個(gè)超市的留存用戶。就是在設(shè)定的時(shí)間間隔都進(jìn)行購物的客戶,一般是計(jì)算七日留存,就是七天后誰來購物了。
????接著我們看題目,我就直接上原圖了:
??? 1.看了下表結(jié)構(gòu),這里我也構(gòu)造了一些數(shù)據(jù)?:
????2.看他的需求,
????????第一步是進(jìn)行了三個(gè)判斷,頭部,尾部,和腰部,定義是上個(gè)月的不同消費(fèi)額。
????????第二步是留存的概念,上個(gè)月消費(fèi)了,這個(gè)月也消費(fèi)了,看到這里,同學(xué)們應(yīng)該都想到了關(guān)聯(lián)。
????????第三步是定義了上個(gè)月和這個(gè)月的概念,這個(gè)很重要。
????3.我們開始做,看到結(jié)果集和金額沒有關(guān)系,只是中間需要轉(zhuǎn)換成不同客戶層,所以我拆開來看,先給他 判斷好他的消費(fèi)額
t_6 as (select?客戶名稱,???---計(jì)算上月消費(fèi)用戶和他的類別 case when sum(消費(fèi)金額) > 30000 then '頭部客戶' when sum(消費(fèi)金額) > 10000 then '腰部客戶' else '尾部客戶' end as 客戶類別 from 消費(fèi)表?where?消費(fèi)日期?between?date?'2020-06-01'?and?date?'2020-06-30'?group?by?客戶名稱?having?sum(消費(fèi)金額)>0))t_7 as (select?客戶名稱???--對(duì)本月消費(fèi)用戶進(jìn)行去重 from 消費(fèi)表 where 消費(fèi)日期 between date '2020-07-01' and date '2020-07-31'?group?by?客戶名稱?having?sum(消費(fèi)金額)>0)t_g(select?'頭部客戶'?as?客戶類別?from?dual?--構(gòu)造一個(gè)客戶類別表,防止少數(shù)據(jù)union allselect '腰部客戶' as 客戶類別 from dual union allselect?'尾部客戶'?as?客戶類別?from?dual?)????這三段代碼分別可以得到下面數(shù)據(jù)
select tg.客戶類別, --最后將他們關(guān)聯(lián)起來即可 count(t6.客戶名稱) as 用戶量, count(t7.客戶名稱) as 留存用戶 from t_g tg left join t_6 t6 on tg.客戶類別 = t6.客戶類別 left join t_7 t7 on t7.客戶名稱 = t6.客戶名稱 group by tg.客戶類別---總的代碼如下:with 消費(fèi)表 as(select '張三' as 客戶名稱,date'2020-06-01' as 消費(fèi)日期,10000 as 消費(fèi)金額 from dual union allselect '張三' as 客戶名稱,date'2020-06-09' as 消費(fèi)日期,25000 as 消費(fèi)金額 from dual union allselect '李四' as 客戶名稱,date'2020-06-10' as 消費(fèi)日期,28000 as 消費(fèi)金額 from dualunion allselect '王五' as 客戶名稱,date'2020-06-30' as 消費(fèi)日期,38000 as 消費(fèi)金額 from dualunion allselect '李四' as 客戶名稱,date'2020-07-10' as 消費(fèi)日期,680 as 消費(fèi)金額 from dualunion allselect '李四' as 客戶名稱,date'2020-07-15' as 消費(fèi)日期,6800 as 消費(fèi)金額 from dualunion allselect '王五' as 客戶名稱,date'2020-07-25' as 消費(fèi)日期,3850 as 消費(fèi)金額 from dualunion allselect '馬六' as 客戶名稱,date'2020-07-31' as 消費(fèi)日期,2900 as 消費(fèi)金額 from dual),t_6 as (select 客戶名稱, case when sum(消費(fèi)金額) > 30000 then '頭部客戶' when sum(消費(fèi)金額) > 10000 then '腰部客戶' else '尾部客戶' end as 客戶類別 from 消費(fèi)表 where 消費(fèi)日期 between date '2020-06-01' and date '2020-06-30' group by 客戶名稱 having sum(消費(fèi)金額)>0) ,t_7 as (select 客戶名稱 from 消費(fèi)表 where 消費(fèi)日期 between date '2020-07-01' and date '2020-07-31' group by 客戶名稱?having?sum(消費(fèi)金額)>0),t_g as (select '頭部客戶' as 客戶類別 from dual union allselect '腰部客戶' as 客戶類別 from dual union allselect '尾部客戶' as 客戶類別 from dual )select tg.客戶類別, count(t6.客戶名稱) as 用戶量, count(t7.客戶名稱) as 留存用戶 from t_g tg left join t_6 t6 on tg.客戶類別 = t6.客戶類別 left join t_7 t7 on t7.客戶名稱 = t6.客戶名稱?group?by?tg.客戶類別?? ?????????????????????????最后得到的結(jié)果
????????????感覺還不錯(cuò)的話,點(diǎn)下在看鼓勵(lì)一下作者吧??
??????????????沒有關(guān)注的也可以關(guān)注下公眾號(hào)~再次感謝
總結(jié)
以上是生活随笔為你收集整理的sql计算留存_SQL基础第七讲:关于用户留存率的计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五子棋怎么玩
- 下一篇: python开发一个自己的技术网站_手把