求用户连续购买天数以及与上次购买间隔天数

本文详细介绍了如何使用SQL查询用户连续购买的天数,并通过Hive的lead函数计算购买间隔天数。步骤包括数据去重、排序、计算连续天数以及利用lead函数找出购买中断的天数,对于理解用户购买行为和分析消费模式具有重要意义。
摘要由CSDN通过智能技术生成

Step 1:对数据进行聚合/去重

	根据需求不同,可能的名称也不尽相同,主要是理解思想.

第一步是对数据按天进行初步聚合(因为一个用户可能在某天有多次购买行为)

因为只是作为演示,所以只用单个用户进行

select member_id,order_date from TABLE_NAME where member_id='1690' group by member_id,order_date 

结果如下:

member_idorder_date
16902021-01-01
16902021-01-02
16902021-01-03
16902021-01-04
16902021-01-06
16902021-01-07
16902021-01-08
16902021-01-09
16902021-01-10
16902021-01-11
16902021-01-12
16902021-01-13
16902021-01-15

结果就不展示完全了…

Step 2:对用户进行分组排序

我们把上一个结果表称为: TABLE_1

select
   member_id
  ,order_date 
  ,row_number() over(partition by member_id order by order_date) as rank_num
from
  TABLE_1 

结果如下:

member_idorder_daterank_num
16902021-01-011
16902021-01-022
16902021-01-033
16902021-01-044
16902021-01-065
16902021-01-076
16902021-01-087
16902021-01-098
16902021-01-109
16902021-01-1110
16902021-01-1211
16902021-01-1312
16902021-01-1513

Step 3:日期与序号进行减法运算

	思路: 如果我的日期是连续的.这时日期减去序号天数,那么连续的日期会得到同一个日期,我们暂且称之为起始日期.

我们把上一个结果表称为: TABLE_2

select
    member_id
   ,order_date 
   ,rank_num
   ,date_sub(order_date,rank_num) as origin_date
from
  TABLE_2

结果如下:

member_idorder_daterank_numorigin_date
16902021-01-0112020-12-31
16902021-01-0222020-12-31
16902021-01-0332020-12-31
16902021-01-0442020-12-31
16902021-01-0652021-01-01
16902021-01-0762021-01-01
16902021-01-0872021-01-01
16902021-01-0982021-01-01
16902021-01-1092021-01-01
16902021-01-11102021-01-01
16902021-01-12112021-01-01
16902021-01-13122021-01-01
16902021-01-15132021-01-02

Step 4:获取开始连续的日期以及连续天数

	其实从上面的结果表中就已经能够统计出那些用户的连续天数满足需求了.为了保留更多信息,所以还是可以继续进行加工

我们把上一个结果表称为: TABLE_3

select
   table_a.member_id                 	  as member_id
  ,table_a.continuous_start_date    	  as continuous_start_date    
  ,count(table_a.continuous_start_date)   as continuous_date
from
  (
	select
		member_id
	   ,min(order_date) over(partition by member_id,origin_date) as continuous_start_date
	from
	  TABLE_3
  ) table_a
 group by table_a.member_id,table_a.continuous_start_date 

结果如下:

member_idcontinuous_start_datecontinuous_date
16902021-01-014
16902021-01-068
16902021-01-159
16902021-01-256
16902021-02-051
16902021-02-071
16902021-02-093

Step 5:使用Hive中lead函数

	lead() over()   将下一行提到当前行来另起字段 
		lead(需要调整的字段名,下几行,空余部分用什么补充)


	lag() over()     将上一行提到当前行来另起字段
		lag(需要调整的字段名,上几行,空余部分用什么补充)

饱经沙场的都知道,产品的提数需求后面一般都会跟着无数的顺便、再来等等…

	思路: 当   (continuous_start_date + continuous_date) - 下一行的continuous_start_date   =  中断天数

其实算中断天数的方法很多.我这里就采用 lead函数来实现.我们把上面的结果表称为: TABLE_4

select
   a.member_id                as member_id                
  ,a.continuous_start_date    as continuous_start_date      
  ,a.continuous_next_date     as continuous_next_date 
  ,a.continuous_date       	  as continuous_date       	   
  ,datediff(a.continuous_next_date,date_add(a.continuous_start_date,a.continuous_date)) as discontinuity_date
from
(
	 select
	   member_id  as  member_id  
	  ,continuous_start_date  as  continuous_start_date  
	  ,lead(continuous_start_date,1,0) over(partition by member_id,continuous_start_date) as continuous_next_date
	  ,continuous_date	as  continuous_date	
	 from
	   TABLE_4
 )a

结果如下:

member_idcontinuous_start_datecontinuous_next_datecontinuous_datediscontinuity_date
16902021-01-012021-01-0641
16902021-01-062021-01-1581
16902021-01-152021-01-2591
16902021-01-252021-02-0565
16902021-02-052021-02-0711
16902021-02-072021-02-0911
16902021-02-092021-02-1331
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值