点击关注公众号,干货第一时间送达

"比率"的问题,不知道诸位遇到过没有,
今天来看看,
补上这个知识点。
【温馨提示:建表语句及数据导入脚本,可以翻看前面的文章:
一、需求场景
题目:
从订单信息表中,查询首次下单后第二天连续下单的用户比率。
订单信息表(order_info)如下:

正确结果:

二、解决方案
演示工具:Hive-3.1.3 + DataGrip2022
要求的是用户比率,但首先需要分析的是用户下单情况。
大致的思路就是:
查询出每个用户第一次下单日期,和第二次下单日期,
计算这两个日期的差值,从而获得连续下单的用户数量,
最后算个比值即可。
(1)分组计算每个用户的下单日期
select user_id,create_date
from order_info
group by user_id,create_date
结果集:

(2)为每个用户的下单日期排序
因为第(1)步骤里面已经进行分组,这步骤的排序可以任意使用排序函数,rank()、dense_rank()、row_number(),
有关这三个开窗排序函数的使用,可以翻看前面的文章:
select
user_id,
create_date,
rank() over (partition by user_id order by create_date) as rk
from (
select user_id,create_date
from order_info
group by user_id,create_date
)t1
结果集:

(3)筛选每个用户的前2个下单日期
因为要计算首日下单和第二次连续下单的用户比率,
所以此处需要先筛选首日下单日期和第二次下单日期,
这筛选出的两个日期,可以通过max() 和 min() 函数排序。
select user_id,
min(create_date) as firstDt,
max(create_date) as secondDt
from (
select
user_id,
create_date,
rank() over (partition by user_id order by create_date) as rk
from (
select user_id,create_date
from order_info
group by user_id,create_date
)t1
)t2
where rk<=2
group by user_id
结果集:

(4)计算每个用户前两次下单日期的差值
日期差值的计算可以使用 datediff() 函数,
再搭配sum() 函数进行数量的累加,
总数就是 count(*)
比值就好求了。
select sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100
from (
select user_id,
min(create_date) as firstDt,
max(create_date) as secondDt
from (
select
user_id,
create_date,
rank() over (partition by user_id order by create_date) as rk
from (
select user_id,create_date
from order_info
group by user_id,create_date
)t1
)t2
where rk<=2
group by user_id
)t3
结果集:

(5)对结果值可以保留两位小数
使用 round() 函数
select round(sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100,2)
from (
select user_id,
min(create_date) as firstDt,
max(create_date) as secondDt
from (
select
user_id,
create_date,
rank() over (partition by user_id order by create_date) as rk
from (
select user_id,create_date
from order_info
group by user_id,create_date
)t1
)t2
where rk<=2
group by user_id
)t3
结果:

(6)将结果值拼接上百分号%
select concat(round(sum(`if`(datediff(secondDt,firstDt)=1,1,0)) / count(*) *100,2),'%')
from (
select user_id,
min(create_date) as firstDt,
max(create_date) as secondDt
from (
select
user_id,
create_date,
rank() over (partition by user_id order by create_date) as rk
from (
select user_id,create_date
from order_info
group by user_id,create_date
)t1
)t2
where rk<=2
group by user_id
)t3
结果:


文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




