1.建表语句
DROP TABLE IF EXISTS ads_order_continuously_user_count;
CREATE EXTERNAL TABLE ads_order_continuously_user_count
(
`dt` STRING COMMENT '统计日期',
`recent_days` BIGINT COMMENT '最近天数,7:最近7天',
`order_continuously_user_count` BIGINT COMMENT '连续3日下单用户数'
) COMMENT '最近7日内连续3日下单用户数统计'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/warehouse/gmall/ads/ads_order_continuously_user_count/';
2.数据装载
2.1 思路分析
连续三日下单的记录有这样的特点:按照日期升序排列,那么一定存在某一个日期与它后两行的日期相差两天。据此可以筛选连续下单用户数。
2.2 执行步骤
我们要获取最近7日内用户的下单日期,数据取自dws_trade_user_order_1d,筛选最近7日分区的数据即可。开窗,按照用户分区,dt(下单日期)升序排列,调用lead()函数获取后两行的dt取值,而后用datadiff计算与dt的天数差,记为diff,上文提到,如果是连续三日下单的记录,一定存在某条数据的diff为2。筛选diff=2的数据,即可获得所有满足条件的用户,如果连续下单的天数为4天及以上,那么同一用户满足条件的数据就不止一条,需要去重,因此调用count(distinct user_id)完成统计。
2.3 图解
略
2.4 代码实现
insert overwrite table ads_order_continuously_user_count
select * from ads_order_continuously_user_count
union
select
'2022-06-08',
7,
count(distinct(user_id))
from
(
select
user_id,
datediff(lead(dt,2,'9999-12-31') over(partition by user_id order by dt),dt) diff
from dws_trade_user_order_1d
where dt>=date_add('2022-06-08',-6)
)t1
where diff=2;
2.5 思考题
还有没有其他思路?
- 思路一:
(1)思路分析
(2)执行步骤
(3)图解
(4)代码实现
select
count(distinct(user_id))
from
(
select
user_id
from
(
select
user_id,
date_sub(dt,rank() over(partition by user_id order by dt)) diff
from dws_trade_user_order_1d
where dt>=date_add('2022-06-08',-6)
)t1
group by user_id,diff
having count(*)>=3
)t2;
3. 数据链路