【题目】

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

注意:

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

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

问题

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

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

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

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

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

【解题步骤】

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

(1)日期格式化

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

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

因此可以写出下列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);

(2) 转换成巴西时间

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

因此可以写出下列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) ;

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

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

(1)应答率

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

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

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

根据题目的业务要求,需要对不同的条件进行统计,在《猴子 从零学会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 订单信息表;

(2)完单率

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

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

所以完成订单数为:

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 订单信息表;

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

根据题目中指标定义:

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

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

SQL计算时间差_晓之以理的喵~~的博客-CSDN博客_sql计算时间差多少分钟SQL计算时间差_晓之以理的喵~~的博客-CSDN博客_sql计算时间差多少分钟

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');

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

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

sql语句如下:

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

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

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


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

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

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

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


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

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

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

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

用户行为分类

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

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

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

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

 转载与公众号:猴子数据分析

关于时间函数的使用可以参考往期文章

SQL必会——常见时间数据的处理_Begin to change的博客-CSDN博客

SQL面试题之2020滴滴笔试题(日期数据的处理方法介绍详解)相关推荐

  1. 2021滴滴笔试题算法题

    2021滴滴笔试题 编程题第一题: 大概是:一个优秀的操作系统,应该具有一个好的分配任务的算法,现在假设 一个任务具有等待时间和执行时间,且必须在先等待后执行,而计算机每次只能执行一个任务,但可以等待 ...

  2. 招聘软件测试笔试题及答案,软件测试笔试题及答案 招聘笔试题(一般能力测试50道及答案).doc...

    软件测试笔试题及答案 招聘笔试题(一般能力测试50道及答案) 一般能力测试 一. 数学运用 数学推理: 1.22 18 14 10 6 ( ) A.0 B.2 C.3 D.4 2.20 12 32 1 ...

  3. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  4. 平安外包软件测试面试题,中国平安银行软件测试笔试题 .doc

    中国平安银行软件测试笔试题 .doc 中国平安银行软件测试笔试题 导语:下面小编为你整理为了中国平安银行关于软件 测试笔试试题,欢迎阅读! 中国平安银行关于软件测试笔试试题(一) 下面是一平安银行的软 ...

  5. php高级程序员笔试题,PHP程序员笔试题含答案

    入门级php程序员笔试题(总100分/47题) 简述题(50分) 1.用php打印出前一天的时间格式是2006-5-10 22:21:21(2分) echo date("Y-m-d G:i: ...

  6. linux 将test.log中第1行的所有都替换成,【Linux面试题7】三剑客笔试题集合

    三剑客笔试题集合 一. 三剑客-基础部分题目 1. 选择 1.在给定文件中查找与条件相符字符串的命令及查找某个目录下相应文件的命令为:(多选)(AC) A:grep B:gzip C:find D:s ...

  7. 一次Java解析数独的经历,java面试题,java高级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 1. ...

  8. Java JDBC连接Oracle,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 1. ...

  9. java英文笔试题_java英文面试笔试题

    java英文面试笔试题 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,小编收集了java英文面试笔试题,欢迎阅读. Question: ...

  10. c语言面试题下载,C语言笔试题A.doc

    C语言笔试题A 选择题(本大题共25小题,每小题2分,共50分) 1.C语言程序总是从 c 开始执行. A.书写顺序的第一个函数 B.书写顺序的第一条执行语句 C.主函数main D.不确定 2.以下 ...

最新文章

  1. Microsoft.NET框架程序设计--20 CLR寄宿、应用程序域、反射
  2. 21天学通python pdf-21天学通Python PDF百度网盘资源下载
  3. RHCSA笔记整理(1)
  4. Spring 极速集成注解 Redis 实践
  5. nodejs全局安装和本地安装的区别
  6. 【视频教程】使用 ASP.NET Core 3.x 构建 RESTful Web API 已完结
  7. mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
  8. WCF宿主与服务托管
  9. 塘沽十三中2021年高考成绩查询,2020天津高考成绩查询
  10. 关于IPMI的几个问题
  11. L2-028 秀恩爱分得快-PAT团体程序设计天梯赛GPLT
  12. Linux防火墙Firewall和Iptables的使用
  13. ubuntu 安装gcc
  14. 简单html倒计时器代码,js简单倒计时实现代码
  15. Quartz配置信息
  16. android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
  17. python隐藏部分代码_python源码隐藏
  18. Spark性能优化之-资源调优
  19. tkinter + wxpy 实现微信发送信息 接收消息 并保存聊天记录的功能(GUI)
  20. [转]jackson json字符串、map、java对象的转换例子

热门文章

  1. Vue 拖拽缩放组件 vue-drag-resize属性
  2. 带“小弟”其实是一种投资
  3. 小猫爪:动手笔记01-FreeRTOS移植
  4. 三国演义人物出场次数
  5. 网站打开速度慢怎么解决
  6. 用python实现小说的平均句长,词性占比,关键词,标点符号,词形统计
  7. Selctive Search中的ABO评价方法
  8. kerberos开启kdc的debug日志
  9. 数学符号名称,解释,定义加举例
  10. Java前方交会后方交会编程_摄影测量后方交会、前方交会程序