sql计算留存_SQL基础第七讲:关于用户留存率的计算
????最近,好幾個(gè)小伙伴都拿著關(guān)于用戶留存的面試題來(lái)問(wèn)我,所以今天單獨(dú)開(kāi)一篇文章講一下留存問(wèn)題。
????首先看一下留存是什么,簡(jiǎn)單來(lái)說(shuō),我和你今天在一家超市購(gòu)物了,明天我來(lái)購(gòu)物了,你沒(méi)來(lái),那么我就是這個(gè)超市的留存用戶。就是在設(shè)定的時(shí)間間隔都進(jìn)行購(gòu)物的客戶,一般是計(jì)算七日留存,就是七天后誰(shuí)來(lái)購(gòu)物了。
????接著我們看題目,我就直接上原圖了:
??? 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.我們開(kāi)始做,看到結(jié)果集和金額沒(méi)有關(guān)系,只是中間需要轉(zhuǎn)換成不同客戶層,所以我拆開(kāi)來(lái)看,先給他 判斷好他的消費(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)起來(lái)即可 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é)果
????????????感覺(jué)還不錯(cuò)的話,點(diǎn)下在看鼓勵(lì)一下作者吧??
??????????????沒(méi)有關(guān)注的也可以關(guān)注下公眾號(hào)~再次感謝
總結(jié)
以上是生活随笔為你收集整理的sql计算留存_SQL基础第七讲:关于用户留存率的计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 五子棋怎么玩
- 下一篇: jpi多表联查_数据库两表联查、多表联查