45.复购率问题求解


45.复购率问题求解_第1张图片
思路分析:
(1)近xx天,最大日期肯定就是最新的一天,故先用max(order_date) over() today计算当天日期
(2)过滤出最近90天的订单并且按照user_id,product_id分组求购买次数;
(3)如果购买次数为1则忽略,大于1参与计数一次分母是总人数
cast(sum(IF(order_time = 1, 0, 1)) / count(1) as decimal(16, 2)) cpr

注:decimal格式数据说明16表示总长度,decimal(16, 2)表示整数部分长度为16-2=14位。小数部分长度为2位,如果整数部分超过了14位则被截断,数据会出现错误。

代码实现:

SELECT 
    product_id,
    --如果购买次数为1则忽略,大于1参与计数一次;分母是总人数
    cast(sum(IF(order_time = 1, 0, 1)) / count(1) as decimal(16, 2)) cpr
from(
        select 
            user_id,
            product_id,
            --求购买次数
            count(1) order_time
        from(
                SELECT 
                    user_id,
                    product_id,
                    order_date,
                    max(order_date) over() today
                from order_detail
            ) t1
        where datediff(today, order_date) <= 90
        group by 
            product_id,
            user_id
    ) t2
group by product_id
order by 
    cpr desc,
    product_id;

你可能感兴趣的:(SQL,hive,hive,大数据,sql)