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