滴滴出行数据分析师面试经验

2020-10-26 14:44:38 浏览数 (1)

最近投了滴滴国际部的数据分析师面试,第一轮线上面试,题目有点复杂,很容易做错,不过也是基础的业务SQL题目。

Part. 1 数据

Part. 2 答案

1. 订单的应答率,完单率分别是多少?

首先对日期进行格式化

代码语言:javascript复制
update didi set call_time=cast(call_time as datetime);
update didi set grab_time=cast(grab_time as datetime);
update didi set cancel_time=cast(cancel_time as datetime);
update didi set finish_time=cast(finish_time as datetime);

对日期减去11,计算巴西时间

代码语言:javascript复制
update didi set call_time= DATE_SUB(call_time,INTERVAL 660 minute) ;
update didi set grab_time= DATE_SUB(grab_time,INTERVAL 660 minute) ;
update didi set cancel_time= DATE_SUB(cancel_time,INTERVAL 660 minute) ;
update didi set finish_time= DATE_SUB(finish_time,INTERVAL 660 minute) ;
代码语言:javascript复制
select sum(case when grab_time  between '2018-03-05' and '2018-03-12' then 1 else 0 end)/count(*) as 应答率,
sum(case when finish_time  between '2018-03-05' and '2018-03-12' then 1 else 0 end)/count(*) as 完答率
from didi

这里值得注意的是如果我们要截止到3-11号,一定要在between当中写到3-12号。

2. 呼叫应答时间有多长?

代码语言:javascript复制
select sum(TIMESTAMPDIFF(minute,call_time,grab_time))/count(grab_time) as 呼叫应答时间
from didi
where grab_time between '2018-03-05' and '2018-03-12'

3. 从这一周的数据来看,呼叫量最高的是哪一个小时(当地时间)?呼叫时间最少的是哪一个小时(当地时间)?

代码语言:javascript复制
ALTER TABLE didi add COLUMN call_time_hour varchar(255);
UPDATE didi
SET 
call_time_hour=DATE_FORMAT(call_time,'%k')

数据格式化转换成小时

代码语言:javascript复制
select *
from
(select call_time_hour,count(order_id) as 最小次数
from didi
GROUP BY call_time_hour
order by 最小次数 asc )a
limit 2
代码语言:javascript复制
select *
from
(select call_time_hour,count(order_id) as 最大次数
from didi
GROUP BY call_time_hour
order by 最大次数 desc )a
limit 1

4. 呼叫订单第二天继续呼叫的比例有多少(这里包含取消订单,题目没说清楚)?

代码语言:javascript复制
ALTER TABLE didi add COLUMN call_time_day varchar(255);
UPDATE didi
SET 
call_time_day=DATE_FORMAT(call_time,'%Y-%m-%d')


select count(*)/2/297 as 次日打车率
from (
select TIMESTAMPDIFF(day,b.call_time_day,a.call_time_day) as 间隔
from didi a
left JOIN didi b
on a.passenger_id=b.passenger_id and a.order_id <> b.order_id
where a.call_time_day between '2018-03-05' and '2018-03-12'
and b.call_time_day between '2018-03-05' and '2018-03-12'
)a
where 间隔 =1

先要转换成天,不然隔天如果没有超过24小时可能算作是同一天,要注意的是left join 运算后有笛卡尔积运算产生四条数据,两条是相同的两个id,这里where 间隔=0 已经筛除,还有一条是对称的所以要进行除以2,最后除以总数297就是次日打车率了。

做到第四题的表是这个样子:

5. (选做)如果要对这100个乘客进行分类,你认为需要参考哪一些因素?

  • 我们的数据提供了完成时间和接单时间,忽略司机到达乘客的接单地点的时间,我们可以计算出乘客在乘车中花了多少时间,对于这个时间可以进行预判,这是长途、中途还是短途,可以分析乘客的乘车习惯
  • 按照我们的发单时间可以判断乘客是在时间点发单的,他的需求是怎么产生的,比如切分成上班、下班、就餐、出游、临时等场景。
  • 使用RFM模型,这里的数据提供了最近一次打车的时间并且可以计算出打车频率,将用户切分成重要价值用户和重要发展用户或者中要保持用户和一般价值用户。对不用的用户考虑不用的用户挽留策略。对于打车频率高但是近期没有消费的重要保持用户,使用邮件推送、APP push的方法、活动短信提醒的方法召回。对于打车频率不高但是近期有打车的重要发展用户,应该用会员权益或者发放优惠券的形式促进消费次数。
  • 高峰期集中在18点,说明用户大多喜欢下午因公打车。可以考虑从远处进行调度车辆,看能否起始地和目的地形成互补,不造成空车回去或者过去。
  • 因为知道了取消订单的量,可以考虑在高峰期间取消订单的数量也就是订单的满足率,滴滴公司应该着重考虑快车调度问题。
  • 我们可以用sql计算出打车的平均时长,从滴滴数据库中获得该地区总车辆,从而得出车辆的需求量。

总结:

题目存在很多易错点,因为是真实的业务问题,特别是对日期的处理大家要加以注意。

0 人点赞