最近,好几个小伙伴都拿着关于用户留存的面试题来问我,所以今天单独开一篇文章讲一下留存问题。
首先看一下留存是什么,简单来说,我和你今天在一家超市购物了,明天我来购物了,你没来,那么我就是这个超市的留存用户。就是在设定的时间间隔都进行购物的客户,一般是计算七日留存,就是七天后谁来购物了。
接着我们看题目,我就直接上原图了:
1.看了下表结构,这里我也构造了一些数据 :
2.看他的需求,
第一步是进行了三个判断,头部,尾部,和腰部,定义是上个月的不同消费额。
第二步是留存的概念,上个月消费了,这个月也消费了,看到这里,同学们应该都想到了关联。
第三步是定义了上个月和这个月的概念,这个很重要。
3.我们开始做,看到结果集和金额没有关系,只是中间需要转换成不同客户层,所以我拆开来看,先给他 判断好他的消费额
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 --构造一个客户类别表,防止少数据
union all
select '腰部客户' as 客户类别 from dual
union all
select '尾部客户' 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.客户类别
复制
---总的代码如下:
with 消费表 as
(
select '张三' as 客户名称,date'2020-06-01' as 消费日期,10000 as 消费金额 from dual
union all
select '张三' as 客户名称,date'2020-06-09' as 消费日期,25000 as 消费金额 from dual
union all
select '李四' as 客户名称,date'2020-06-10' as 消费日期,28000 as 消费金额 from dual
union all
select '王五' as 客户名称,date'2020-06-30' as 消费日期,38000 as 消费金额 from dual
union all
select '李四' as 客户名称,date'2020-07-10' as 消费日期,680 as 消费金额 from dual
union all
select '李四' as 客户名称,date'2020-07-15' as 消费日期,6800 as 消费金额 from dual
union all
select '王五' as 客户名称,date'2020-07-25' as 消费日期,3850 as 消费金额 from dual
union all
select '马六' 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 all
select '腰部客户' as 客户类别 from dual
union all
select '尾部客户' 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.客户类别
复制
最后得到的结果
感觉还不错的话,点下在看鼓励一下作者吧
没有关注的也可以关注下公众号~再次感谢
文章转载自SQL大数据开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1327次阅读
2025-03-13 11:40:53
【专家观点】罗敏:从理论到真实SQL,感受DeepSeek如何做性能优化
墨天轮编辑部
1318次阅读
2025-03-06 16:45:38
2025年2月国产数据库中标情况一览:GoldenDB 3500+万!达梦近千万!
通讯员
921次阅读
2025-03-06 11:40:20
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
469次阅读
2025-03-13 14:38:19
AI的优化能力,取决于你问问题的能力!
潇湘秦
442次阅读
2025-03-11 11:18:22
优炫数据库成功应用于国家电投集团青海海南州新能源电厂!
优炫软件
346次阅读
2025-03-21 10:34:08
达梦数据与法本信息签署战略合作协议
达梦数据
300次阅读
2025-03-06 09:26:57
国产化+性能王炸!这套国产方案让 3.5T 数据 5 小时“无感搬家”
YMatrix
288次阅读
2025-03-13 09:51:26
GoldenDB数据库社区正式上线!期待与您共享新知
GoldenDB分布式数据库
242次阅读
2025-03-12 14:06:39
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
240次阅读
2025-03-10 07:58:44