图解面试题:滴滴求职真题,学会后轻松拿下各公司offer

c75d56fa8071a94eaf9397eb3cfb6861.jpeg

【题目】

“订单信息表”里记录了巴西乘客使用打车软件的信息,包括订单呼叫、应答、取消、完单时间。(滴滴笔试题)

0102e4de0c203a2e72126b392d9f2ebc.jpeg

30ad11c1027fd4fd2a95aa43edd27d85.jpeg

注意:

(1)表中的时间是北京时间,巴西比中国慢11小时。

(2)应答时间列的数据值如果是“1970”年,表示该订单没有司机应答,属于无效订单。

827b28c88c08de14cd44576374bee953.png

问题

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

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

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

4. 呼叫订单第二天继续呼叫的比例有多少?

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

【解题步骤】

我们首先对数据进行预处理,将北京时间转化为巴西时间。具体需要分两步来实现,首先为了确保表中的时间为标准的日期格式,我们统一对其进行日期格式处理。然后再将处理后的日期转换成巴西时间。

e94ba85ec6a839de57c3f3f2d1f39a61.png

(1)日期格式化

由于在日期格式化中,我们会涉及到需要修改表中的日期数据,因此考虑用update语句。而修改表的具体操作会涉及到日期数据类型之间的转换,我们考虑用cast函数。

86d430c6b15e7e2c9eadb5f74040804d.png

34346f6c5f827f0e7fab117aacdf3801.png

由于表中的时间应是datetime的格式,也就是精确到时分秒(YYYY-MM-DD HH:mm:ss)。转换后的效果如下图。

550dcb9d8ec3765a57bd01062b5c109d.png

因此可以写出下列sql语句。

update 订单信息表 set call_time=cast(call_time as datetime);


update 订单信息表 set grab_time=cast(grab_time as datetime);


update 订单信息表 set cancel_time=cast(cancel_time as datetime);


update 订单信息表 set finish_time=cast(finish_time as datetime);

日期格式化后的表如下图。

c5dd488335f375e4890e9efc047e07fa.png

(2) 转换成巴西时间

由于数据中的时间为北京时间,而且已知巴西比中国慢11小时,因此我们这里使用 date_sub函数。

28100a877e8fc90b2365efd4c775b5dc.jpeg

因此可以写出下列sql语句:

update 订单信息表 
set call_time= date_sub(call_time, interval 11 hour) ;


update 订单信息表 
set grab_time= date_sub(grab_time, interval 11 hour) ;


update 订单信息表 
set cancel_time= date_sub(cancel_time, interval 11 hour) ;


update 订单信息表
set finish_time= date_sub(finish_time, interval 11 hour) ;

时间转换结果如下图:

82243e789fe3d416deb6f1c8b2f0da34.png

按照以上操作,数据日期预处理完成。

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

(1)应答率

应答率=应答订单数/呼叫订单数 

247515da3aa9f6435ce202a2f34a1299.png

呼叫订单: 呼叫订单数等于呼叫时间(call_time)这一列的数据总数,可以用count(call_time)汇总。

应答订单:应答订单数等于应答时间(grab_time)这一列的数据总数,可以用count(grab_time)汇总。需要注意,这一列里的值不等于‘1970’的数据的数量才是有效的应答订单数。如下图:红框的部分为应答订单。

21ebd5ef20851564c4abc4d48863609c.png

根据题目的业务要求,需要对不同的条件进行统计,在《猴子 从零学会sql》里讲过条件判断要用case when表达式。所以应答订单数对应的sql是:

sum(case when grab_time <> 1970 then 1 else 0 end)

现在可以计算出指标 应答率=应答订单数/呼叫订单数 :

select sum(case when grab_time <> 1970 then 1 else 0 end)/count(call_time) as 应答率
from 订单信息表;

查询结果如下:

90f51d443726e63528ed1c972c20d87d.png

(2)完单率

完单率=完成订单数/呼叫订单数

1ad767dc7b15f2eac005d18f49842467.png

完成订单: 完成时间(finish_time)这一列中,值不等于‘1970’的数据数量为有效的完成订单数。如下图:红框的部分为完成订单。

4f6c767050f133d8bbc8af0552599a82.png

所以完成订单数为:

sum(case when finish_time <> 1970 then 1 else 0 end)

现在可以计算出指标完单率=完成订单数/呼叫订单数 :

select sum(case when finish_time <> 1970 then 1 else 0 end)/count(*) as 完单率
from 订单信息表;

查询结果如下

01e113a7a1eb0ff859a37fdfa0ed5938.png

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

根据题目中指标定义:

呼叫应答时间=被应答订单从呼叫到被应答时长总和/被应答订单数量

被应答订单从呼叫到被应答时长=被应答的时间(grab_time) - 呼叫的时间(call_time)。

这涉及到计算两个日期之间的差值,《猴子 从零学会sql》里讲到对应单函数是timestampdiff。下图是这个函数的用法。

0c0b7f1488f5ea3f0663c7c2b1d0c872.png

我们回到题目,利用timestampdiff函数计算呼叫到被应答时长的总和。

c9cb08a3237c5af88e58718928e4b6b6.png

综上,相应的sql语句分析如下

3534942191ec2edf9f6f4360a169c510.png

查询结果如下

ac9fe66e14ee890e3df844d1b6f2a03d.png

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

(1)时间转换

由于题目中要求的是“哪一个小时”,因此我们首先将数据格式化转换成小时。新增一列来表示时间中的“小时”,列名设为call_time_hour。

-- 添加列
alter table 订单信息表 add column call_time_hour varchar(255);

利用date_format 函数,用于以不同的格式显示日期数据,将将数据格式转换成小时。

/** 
给列添加数据
%k表示显示的是24小时制中的小时
*/
update 订单信息表
set call_time_hour=date_format(call_time,'%k');

转化后的表如下图

221e279f40727540fd3c2fbc2bfe52b8.png

(2)呼叫量最高的是哪一个小时?

呼叫订单是order_id列。按“每个小时”分组(group by call_time_hour),然后统计每个小时的呼叫订单量count(order_id),然后排序就可以知道哪个小时的订单量最高。

下图给出sql语句分析过程:

8530749bb349f114b101852a00f261ff.png

此时得到查询结果如下图

9ed6031b770d4589aa3993495d722208.png

因为题目要求的是排序后的最大值(呼叫量最高的小时),可以用limit子句 来筛选出第一行数据。

a9774aeb369c0ae166a8be5ca202fcff.png

sql语句如下:

select call_time_hour,count(order_id) as 最大次数
from 订单信息表
group by call_time_hour
order by 最大次数 desc 
limit 1;

(2)呼叫量最少的是哪一个小时?

接着上面的排序结果,我们看到有3个呼叫小时的数据都为最小次数,用limit 3都将它们筛选出来即可。

7de3c06b8547e37eb9606f55101c9109.png

select call_time_hour,count(order_id) as 最小次数
from 订单信息表
group by call_time_hour
order by 最小次数 asc 
limit 3;

4. 呼叫订单第二天继续呼叫的比例有多少?

呼叫订单第二天继续呼叫的比例=第二天继续呼叫的用户量/总的呼叫订单量。

计算第二天继续呼叫的用户量的思路如下图:

8127dd0291a3fb90be6d5d49a38016d0.png

我们具体分析看每一部分。

(1)自关联查询,求得呼叫的时间间隔。由于我们需要时间的单位为天,因此我们使用date_format函数来提取出日期中的“年月日”部分。

8e904ce2a5c4d3c0fd899bca576ee4f7.png

sql语句如下:

-- 添加一列来显示时间中的“年月日”部分
alter table 订单信息表 add column call_time_day varchar(255);
update 订单信息表
set call_time_day=date_format(call_time,'%Y-%m-%d');

此时变化后的表如下:

166dfebe50555b6f7dba6059264cdb96.png

我们接下来利用表的联结来计算相隔天数。这里由于涉及到计算相隔的天数之差,我们使用上面讲过的timestampdiff函数。单位为天。

77dc0b3d1fd927cbd11ed8c931a81276.png

此时查询结果如下

ef5dd6de8608c4f65b0670b75fbf1adf.png

筛选出时间差为1天的数据,也就是间隔=1的数据。

99f85dd486a8f117f2722ae0b75630c2.png

利用子查询嵌套,将上面的查询结果作为新表,在其中做出筛选,并求和。sql语句分析如下图。

a523587182da3332b3b7439eaacf90b3.png

此时查询结果如下图

113f339cbf202c4a2dd24d5e6dbecfaa.png

最后我们计算出第二天继续呼叫比例

583d4e589986610ccb075956af8cdddd.png

查询结果如下图

5676c7174ee84017b23f5e0b0f777ef1.png

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

我们可以从以下两个角度来考虑对用户分类。

234d4cea9acaf5e64cba50f48b350e9f.png

用户行为分类

1) 根据完成时间和接单时间,可大致计算出乘客在乘车过程中所消耗的时间,对这个时间进行预判,属于长途、中途或者是短途,来分析乘客的乘车习惯。

2) 根据呼叫时间可以判断乘客是在时间点发单的,乘客需求是如何产生的,可分析用户在哪些场景有乘车需求,上班、下班、就餐、出游、临时等场景。

用户价值分类

使用之前学过的RFM分析方法,对用户按价值分类。

2d1d1eade0ccd469e0befbaf6d9b644a.jpeg

RFM具体到本题可以做以下定义:

R:最近一次乘客的完单时间。
F:乘客打车的频率。
M:打车消费的金额。此处可以用乘车过程消耗的时长来代替等。

【本题考点】

1.对日期数据的处理,掌握题目里讲过对常用日期处理方法。

2.考查分析思维能力。使用学过的如何使用数据分析解决问题的框架来解决。

2ecc741ce9c7d5064f8748d3bda800af.jpeg ⬇️点击「阅读原文」

 免费报名 数据分析训练营

猜你喜欢

转载自blog.csdn.net/zhongyangzhong/article/details/129630899