SQL SERVER (1) 滴滴出行2020数据分析面试题

https://zhuanlan.zhihu.com/p/136915306

题目

问题

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

2.呼叫应答时间多长?

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

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

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

答案:

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

应答率 = 应答订单/呼叫订单
所有步骤的预处理:
1)时间列处理成datetime格式

  update [exercise].[dbo].[20210128didi] set 
  call_time = cast(call_time as datetime),
  grab_time = cast(grab_time as datetime),
  cancel_time = cast(cancel_time as datetime),
  finish_time = cast(finish_time as datetime)

image.png

2)将中国时间处理成巴西时间

--SQL SERVERL
 update [exercise].[dbo].[20210128didi] set
  call_time = DATEADD(hour, -11, call_time),
  grab_time = DATEADD(hour, -11, grab_time),
  cancel_time = DATEADD(hour, -11, cancel_time),
  finish_time = DATEADD(hour, -11, finish_time)
--MySQL
 update [exercise].[dbo].[20210128didi] set
  call_time = date_sub(call_time, INTERVAL 11 hour), 
  grab_time = date_sub(grab_time, INTERVAL 11 hour),
  finish_time = date_sub(finish_time, INTERVAL 11 hour)

DATEADD(SQL SERVER):https://www.jianshu.com/p/aa8f4ba3768e (日期函数汇总)
DATE_SUB(My SQL)
作用:DATE_SUB() 函数从日期减去指定的时间间隔。
语法:DATE_SUB(date,INTERVAL expr type)

date 参数是合法的日期表达式。
expr 参数是您希望减去的时间间隔。
type 时间间隔类型(包括second、minute、hour、day、week、month等等)

计算应答率 = 应答订单/呼叫订单

--SQL SERVER 想着详细一点,所以分子分母分开写了
--计算应答率
SELECT SUM(IIF(YEAR(grab_time)<>'1970',1,0)) as N'grab_orders',
        count(call_time) as N'call_orders',
        CAST(CAST(SUM(IIF(YEAR(grab_time)<>'1970',1,0))*1.0*100/count(call_time) AS decimal(10,2)) AS VARCHAR) +'%' as N'grab_rate'
FROM [exercise].[dbo].[20210128didi]

--计算完单率
Select SUM(IIF(YEAR(finish_time)<>1970,1,0)) as N'finish_orders',
        Count(call_time) as N'call_orders',
        CAST(CAST(SUM(IIF(YEAR(finish_time)<>1970,1,0))*100/Count(call_time) AS decimal(10,2)) AS varchar) + '%' AS N'finish_rate'
FROM [exercise].[dbo].[20210128didi]
--My SQL
select sum(if(year(grab_time)<>1970,1,0))/count(call_time)as '应答率',
sum(if(year(finish_time)<>1970,1,0))/count(call_time)as '完单率'
from didi

2.呼叫应答时间多长?

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

--SQL SERVER 使用DATEIFF
SELECT SUM(CAST(DATEDIFF(MINUTE,call_time,grab_time) AS decimal(10,2))) as N'GrabTotalTime',
       SUM(IIF(YEAR(grab_time)<>'1970',1,0)) as N'grabOrders',
       Cast(SUM(CAST(DATEDIFF(MINUTE,call_time,grab_time) AS decimal(10,2)))/SUM(IIF(YEAR(grab_time)<>'1970',1,0)) AS decimal(10,2)) AS N'GrabDuaration'
FROM [exercise].[dbo].[20210128didi]
WHERE YEAR(grab_time)<>1970
-- MY SQL 使用timestampdiff函数
select sum(TIMESTAMPDIFF(MINUTE,call_time,grab_time))/count(grab_time)as '呼叫应答时间'
from didi
where year(grab_time)<>1970;

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

我先查了一下 给的测试数据源确实是一周的量


image.png

前面我们已经处理好了当地时间,接下来直接做就可以了

--SQL SERVER 有个缺点 万一有重复值,再研究下开窗函数在这怎么用
--最高
SELECT TOP 1 *
FROM (
    SELECT DISTINCT DATEPART(hour, call_time) AS _hour, COUNT(call_time) AS _times
    FROM [exercise].[dbo].[20210128didi]
    GROUP BY DATEPART(hour, call_time)
) a
ORDER BY _times DESC
--最低
SELECT TOP 1 *
FROM (
    SELECT DISTINCT DATEPART(hour, call_time) AS _hour, COUNT(call_time) AS _times
    FROM [exercise].[dbo].[20210128didi]
    GROUP BY DATEPART(hour, call_time)
) a
ORDER BY _times 
--MY SQL
-- 新增一列
alter table didi add column call_time_hour VARCHAR(255);
-- 使用substr函数做字符串截取,为新列赋值
update didi set call_time_hour = SUBSTR(call_time from 12 for 2);
-- 方法2:使用date_format函数转换格式
update didi set call_time_hour = DATE_FORMAT(call_time,'%k')

-- 找出呼叫量最高的小时,显示2行防止出现重复值。
select call_time_hour,count(call_time)as'呼叫量'
from didi
GROUP BY call_time_hour
ORDER BY count(call_time) desc
limit 2;

-- 找出呼叫量最少的小时,显示3行确认是否有第三个相等值。
select call_time_hour,count(call_time)as'呼叫量'
from didi
GROUP BY call_time_hour
ORDER BY count(call_time) asc
limit 3;

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

--SQL SERVER
SELECT CAST(CAST(COUNT(DISTINCT a.order_id) * 100 / (
        SELECT COUNT(DISTINCT order_id)
        FROM [exercise].[dbo].[20210128didi]
    ) AS decimal(10, 2)) AS varchar) + '%' AS '第二天继续呼叫比例'
FROM [exercise].[dbo].[20210128didi] a
    JOIN [exercise].[dbo].[20210128didi] b ON a.passenger_id = b.passenger_id
WHERE datediff(day, a.call_time, b.call_time) = 1
--MY SQL
select count(DISTINCT a.order_id)/(select count(DISTINCT order_id) from didi)as'第二天继续呼叫比例' 
from didi a join didi b
on a.passenger_id = b.passenger_id
where datediff(a.call_time,b.call_time)=1;

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

基于已有的表格中数据,可以参RFM模型对用户进行分类,

R:乘客上一次打车距离3月11日的时间间隔

F:乘客在数据期间的打车频率

M:打车消费金额(表中无打车金额,可以用完成订单总时长代替)

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容