可以对窗口函数之后再加条件_SQL窗口函数轻松解决连续N天购买用户问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 19:45   17   0

a18f9997c9d38e077404b588c315a1a0.png

用sql解决如下问题:

1、找出有连续三天购物的用户

2、计算每位客户相邻两次购物的时间差

一、了解数据

订单表表名:ord

字段:name1:客户编号,orderdate:订购日期,amount:购买数量

dcd286d7a79f76b9ff9cf86d24a56f9f.png

1、找出有连续三天购物的用户

2、计算每位客户相邻两次购物的时间差


1、 找出有连续三天购物的用户

方法一:

连续三天购物,就是同一个用户相邻的订单日期都相差1天,比如A001用户2019/10/4、2019/10/5、2019/10/6就是连续三天购物。

c5e4b539888877adaaa605751b021a62.png

可以通过日期将表自连接起来,如果以客户编号相同和日期隔一天连接条件将表自连接,存在隔一天的订单才能连接,不存在即不能连接,就能找到连续两天购物的用户;同理再自连接隔两天的,找到连续三天购物的用户。

隔一天即是:同一个客户第二次购买时间与第一次购买时间的时间差为1天

求日期差,有两个函数;

datediff()函数

cdbccdfc6001bd7e38c5c0836f8204b1.png

timestampdiff()函数

b617e004da0e9e2d4e2ed63efeb5e704.png

datediff()函数:只可以求相差天数

timestampdiff()函数:可以求相差秒数/分钟数/小时数/天数/月数/年数

因为题目只要求天数,所以用datediff()函数就可以了。

如果要求除天数以外的时间就要用timestampdiff函数。

连续2天购物的客户编号

SELECT 

21942105d19d6e27639eda0da54d3da0.png

ord(a)和ord(b)通过编号相同且相邻日期差1天连接起来得到连续两天的购物用户。(看相同颜色的字段)

连续3天购物的客户编号

SELECT 

2ded93ffce56b5a7e3c91c3bd6cdbc03.png

题目要求的显示结果是用户,只显示用户id就可以了

SELECT  

8ab26bc7e6be770a3f7fef9cca7a7ff7.png

方法二:窗口函数

题目要求:找出连续三天购物的用户

思路:连续三天购物,那就是相邻的第3次购物的时间与第1次购物的时间差为2天。

用窗口函数 lead(),往后数两行,得到第3次购物的订购时间;

第3次订购时间 – 第1次订购时间=2,则为连续3天购物。

这样做的前提是:

1) 客户1天内购买多次都算1次;

2) 订购时间列的格式为“年/月/日”

我们的数据符合条件

窗口函数 lead()讲解

bfefec9024a613dddc212e8bf0d00df6.png

取值原理:以A001号客户为例

a34b0ee01b40b1f97a717d60fb8e43b0.png

取值原理:取不到的为空值。

最后计算出相差天数,相差天数为2就是我们要找的客户,即A001号客户符合连续三天购买的条件。

取出第3次订购时间:date3

SELECT 

f1e3f8fdd72f70de8fdb90d3a8031414.png

计算相差天数 :date3-orderdate

SELECT 

6c0689c067870bfe387cdbf2a68db608.png

把相差天数等于2 的筛选出来

SELECT 

得到结果

8ab26bc7e6be770a3f7fef9cca7a7ff7.png

窗口函数比自连接的优点是代码简单,

尤其是如果求连续10天购物的用户用自连接就得连接9次而且容易出错,

但用窗口函数代码量不会增加, 结果准确只需要把相差天数改成9就可以了。

通过上面的学习你们应该掌握了吧?试一试吧!

练一练

2、计算每位客户相邻两次购物的时间差

SELECT 

ae960eb31a720da6d797df479b0a289e.png

喜欢记得点赞哦!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP