计算方式对比
一般计算占比,比如转换率、留存率等,都是先分组求和再相除得到结果,但是在一定的条件下,可以直接使用AVG()求出百分比。
比如,要求统计报名转化率,报名转化率公式为转化率=报名人数/浏览人数
。
在下面图中,两种颜色分别表示了不同的计算过程:
- 淡橘色是第一种直接方法:分别求出浏览人数(7),报名人数(4),转化率=4/7=57%
- 蓝色是使用平均函数AVG():直接对“是否报名”列求平均数,结果也为4/7=57%,其中满足报名条件的人数(4),总人数(7)。
题目满足两个条件:
- 表格中有为唯一ID值,
- 有判断条件的列:在“是否报名”列中,只有0和1,1表示满足了条件(已经报名),0表示没有满足条件(没有报名)。
所以,可以直接使用AVG()函数计算条件列的占比结果。而在实际过程中,上述条件都可以通过聚合计算满足,比如通过if()
函数构建一个判断列。
例一:计算转换率
举个简单栗子,在牛客直播转换率这个题目中,要求:统计每个科目的转换率(sign_rate(%),转化率=报名人数/浏览人数,结果保留两位小数)。(注:按照course_id升序排序)
已知课程表course_tb如下(其中course_id代表课程编号,course_name表示课程名称,course_datetime代表上课时间):
用户行为表behavior_tb如下(其中user_id表示用户编号、if_vw表示是否浏览、if_fav表示是否收藏、if_sign表示是否报名、course_id代表课程编号):
解法
select
b.course_id,
course_name,
round(avg(if_sign)*100,2)
from behavior_tb b
left join course_tb c on c.course_id=b.course_id
group by 1,2
order by course_id asc
例二:计算新用户占比
- 新用户占比=当天的新用户数÷当天活跃用户数(日活数)。
- 如果in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过。
- 新用户占比保留2位小数,结果按日期升序排序。
解法
select
dt
,count(1) dau
,round(avg(if(cnt=1,1,0)),2) as uv_new_ratio #是新用户返回1, 不是新用户返回0
from
(
select
uid,
dt,
row_number()over(partition by uid order by dt) as cnt # 判断是否为新用户
from
(#重新构造基础表格,将进入和离开时间放在同一列
select uid, date(in_time) as dt from tb_user_log
Union
select uid,date(out_time) as dt from tb_user_log) t1
) t2
group by 1
order by dt asc