【hive经典指标,离线数仓指标,ADS层指标分析】最近7日内连续3日下单用户数

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. 数据链路

猜你喜欢

转载自blog.csdn.net/qq_40382400/article/details/132091181