筆試題 |2020 PDD分析師
一、活動運營資料分析
表1:訂單表 orders,大概欄位有(user_id‘使用者編號’, order_pay‘訂單金額’ , order_time‘下單時間’)
表2:活動報名表act_apply,大概欄位有(act_id‘活動編號’, user_id‘報名使用者’,act_time‘報名時間’)
需求:
1、統計每個活動對應所有使用者在報名後產生的總訂單金額,總訂單數。(每個使用者限報一個活動,題幹預設使用者報名後產生的訂單均為參加活動的訂單)。
2、統計每個活動從開始後到當天(考試日)平均每天產生的訂單數,活動開始時間定義為最早有使用者報名的時間。(涉及到時間的資料型別均為:datetime)。
解答:
-- 1.需求一 select b.act_id, count(a.order_time) as num_order, sum(a.order_pay) as sum_order from ( select user_id, order_pay, order_time from orders ) a inner join ( select user_id, act_id, act_time from act_apply ) b on a.user_id= b.user_id where a.order_time >= b.act_time group by b.act_id
-- 2.需求二 select a.act_id, count(order_time)/datediff(now(), a.begin_time) from ( select act_id, user_id, act_time, min(act_time) over (partition by act_id) as begin_time from act_apply ) ainner join ( select user_id, order_time from orders ) b on a.user_id = b.user_id where a.act_time between a.begin_time and b.order_time and b.order_time <= now() -- 補充新增:訂單支付時間 <= 當前時間 group by a.act_id
視窗分析函式可靈活使用,利用 over()
結合聚集函式,例如 sum()
、max()
、min()
、avg()
等,或者 rank()
、 dense_rank()
、row_number()
等。
二、使用者行為分析
表1:使用者行為表tracking_log,大概欄位有(user_id‘使用者編號’,opr_id‘操作編號’,log_time‘操作時間’)
需求:
1、計算每天的訪客數和他們的平均操作次數。
2、統計每天符合以下條件的使用者數:A操作之後是B操作,AB操作必須相鄰。
-- 3.需求三
select date(log_time),
count(distinct user_id) as user_cnt,
avg(num_cnt) as avg_cnt
from
(
select date(log_time),
user_id,
count(opr_id) as num_cnt
from tracking_log
group by date(log_time),
user_id
)
group by date(log_time)
-- 4.需求四 使用者、操作、時間
select date(log_time),
count(distinct user_id)
from
(
select user_id,
date(log_time),
opr_id,
lead(opr_id, 1) over (partition by user_id order by log_time) as opr_id_2
from tracking_log
)
where opr_id = 'A'
and opr_id_2 = 'B'
group by date(log_time)
-- lag 滯後 讓資料向後移動
-- lead 超前 讓資料向前移動
三、使用者新增留存分析
表1:使用者登陸表user_log,大概欄位有(user_id‘使用者編號’,log_time‘登陸時間’)
需求:
每天新增使用者數,以及他們第2天、30天的回訪比例。
如何定義新增使用者:使用者登陸表中最早的登陸時間所在的使用者數為當天新增使用者數;
第2天回訪使用者數:第一天登陸的使用者中,第二天依舊登陸的使用者;--次日留存率
第30天的回訪使用者數:第一天登陸使用者中,第30天依舊登陸的使用者;
-- 5.需求五 使用者、登入時間
select date(a.user_begin),
count(distinct a.user_id) as '新增使用者',
count(distinct b.user_id) as '第2日留存使用者',
count(distinct c.user_id) as '第30日留存使用者'
from
(
select user_id,
min(log_time) as user_begin
from user_log
group by user_id
) a
left join
(
select user_id,
log_time
from user_log
) b
on a.user_id = b.user_id
and date(b.log_time) = date(a.user_begin) + 1
left join
(
select user_id,
log_time
from user_log
) c
on a.user_id = c.user_id
and date(c.log_time) = date(a.user_begin) + 29
group by date(a.user_begin)
此處的 date
日期函式有待商榷,日常oracle中使用 trunc()
函式即可擷取,hive中使用to_date()
亦可。
【參考】
b.order_time