模擬某打車公司的業務題:分析打車的業務問題

某打車公司業務題:分析打車業務問題

公司A是的app(類似滴滴、uber)爲用戶提供打車服務。現有四張表(模擬數據),分別是driver(司機數據)表,online_time(在線時長數據)表,order_info(訂單數據)表,city(城市匹配數據)表。

現有如下業務問題:

  1. 提取2020年8月各城市每天的司機數、快車訂單量和快車流水數據。

  2. 提取2020年8月和9月,每個月的北京市新老司機(首單日期在當月爲新司機)的司機數、在線時長和TPH(訂單量/在線時長)數據。

  3. 分別提取司機數大於20,司機總在線時長大於2小時,訂單量大於1,乘客數大於1的城市名稱數據。

1.熟悉各表數據

(1)diver(司機數據)表

在這裏插入圖片描述
(2)online_time(在線時長數據)表
在這裏插入圖片描述
(3)order_info(訂單數據)表
在這裏插入圖片描述

  表中 “產品線id”中的數字分別表示不同的含義:1代表的是專車,2代表的是企業,3代表的是快車,4代表的是企業快車。

(4)city(城市匹配數據)表
在這裏插入圖片描述

2.解決各業務問題

2.1 提取2020年8月各城市每天的司機數、快車訂單量和快車流水數據

1.提取2020年8月各城市每天的司機數

  解題思路:(1)限定時間在2020年8月,可以使用between and;(2)各城市每天是按照城市和日期進行分組;(3)司機數是使用count(distinct 司機id)來計數,如果司機id是主鍵的話,可以不使用distinct。最終答案如下:

SELECT b.城市名稱,a.日期,count(DISTINCT 司機id) as 司機數
FROM driver as a
LEFT JOIN city as b on a.城市id=b.城市id
WHERE 日期 BETWEEN '2020-08-01' and '2020-08-31'
GROUP BY a.城市id, a.日期;

  部分查詢結果如下:
在這裏插入圖片描述

2.提取2020年8月各城市每天的快車訂單量

  解題思路:(1)時間限定和前面的一樣,也可以使用date_format來限定日期;(2)快車,則需要從產品線id中提取出代表快車的編號,如前面說的,3代表快車,可以使用where來限定id=3;(3)訂單量根據訂單id進行計算。答案如下:

SELECT c.城市名稱,a.日期,COUNT(DISTINCT 訂單id) as 訂單量
FROM order_info as a
LEFT JOIN driver as b on a.司機id=b.司機id
LEFT JOIN city as c on b.城市id=c.城市id
WHERE 產品線id='3' and DATE_FORMAT(a.日期,'%Y-%m')='2020-08'
GROUP BY b.城市id,a.日期;

  結果如下:
在這裏插入圖片描述

3.提取2020年8月各城市每天的快車流水數據

  解題思路:(1)大部分解題思路和前面一樣,有變化的是流水數據,流水數據是需要使用sum來進行計算得到的。答案如下:

SELECT c.城市名稱,a.日期,SUM(流水) as 流水數據
FROM order_info as a
LEFT JOIN driver as b on a.司機id=b.司機id
LEFT JOIN city as c on b.城市id=c.城市id
WHERE 產品線id='3' and DATE_FORMAT(a.日期,'%Y-%m')='2020-08'
GROUP BY b.城市id,a.日期;

  結果如下:
在這裏插入圖片描述

2.2 提取2020年8月和9月,每個月的北京市新老司機(首單日期在當月爲新司機)的司機數、在線時長和TPH(訂單量/在線時長)數據

1.提取2020年8月和9月,每個月的北京市新老司機(首單日期在當月爲新司機)的司機數

  解題思路:(1)提取2020年8月和9月的,則可以使用or來判斷,或者使用union連接都可以,先分別查出8月和9月的數據,再進行聯結;(2)將地點限定爲北京市,則使用where條件;(3)首單日期在當月的爲新司機,說明分別在首單完成日期分別在8月份或者9月份的視爲首單日期,則可以直接使用“首單完成日期”=8月或者9月。答案如下:

SELECT DATE_FORMAT(a.日期,'%Y-%m'),COUNT(DISTINCT a.司機id) as '司機數'
FROM driver as a
LEFT JOIN city as b on a.城市id=b.城市id
WHERE b.城市名稱='北京' AND DATE_FORMAT(a.首次完成訂單時間,'%Y-%m')='2020-08'
	  AND a.`日期` BETWEEN '2020-08-01' and '2020-09-31'
GROUP BY DATE_FORMAT(a.日期,'%Y-%m')

UNION

SELECT DATE_FORMAT(a.日期,'%Y-%m'),COUNT(DISTINCT a.司機id) as '司機數'
FROM driver as a
LEFT JOIN city as b on a.城市id=b.城市id
WHERE b.城市名稱='北京' AND DATE_FORMAT(a.首次完成訂單時間,'%Y-%m')='2020-09'
	  AND a.`日期` BETWEEN '2020-08-01' and '2020-09-31'
GROUP BY DATE_FORMAT(a.日期,'%Y-%m')

  結果如下:
在這裏插入圖片描述

2.提取2020年8月和9月,每個月的北京市新司機的在線時長

  解題思路:(1)提取2020年8月和9月的,則可以使用or來判斷;(2)將地點限定爲北京市,則使用where條件;(3)首單日期在當月的爲新司機,說明分別在首單完成日期分別在8月份或者9月份的視爲首單日期。答案如下:

SELECT DATE_FORMAT(a.日期,'%Y-%m'), a.司機id, SUM(在線時長) as '在線時長'
FROM online_time as a
LEFT JOIN driver as b on a.司機id=b.司機id
LEFT JOIN city as c on b.城市id=c.城市id
WHERE c.城市名稱='北京' and (b.首次完成訂單時間 BETWEEN '2020-08-01' and '2020-08-31'
      OR b.首次完成訂單時間 BETWEEN '2020-09-01' and '2020-09-31')
			AND a.日期 BETWEEN '2020-08-01' and '2020-09-31'
GROUP BY DATE_FORMAT(a.日期,'%Y-%m')

  結果如下:
在這裏插入圖片描述
3.提取2020年8月和9月,每個月的北京市新司機的TPH(訂單量/在線時長)

  解題思路:和前面的類似,還需計算出新司機的訂單量。答案如下:

SELECT t.日期, t.訂單量/t.在線時長 as '新司機的TPH'
FROM
(SELECT DATE_FORMAT(a.日期,'%Y-%m') as '日期', COUNT(DISTINCT d.訂單id) as '訂單量',SUM(在線時長) as '在線時長'
FROM online_time as a
LEFT JOIN driver as b on a.司機id=b.司機id
LEFT JOIN city as c on b.城市id=c.城市id
LEFT JOIN order_info as d on a.司機id=d.司機id
WHERE c.城市名稱='北京' and (b.首次完成訂單時間 BETWEEN '2020-08-01' and '2020-08-31'
      OR b.首次完成訂單時間 BETWEEN '2020-09-01' and '2020-09-31')
			AND a.日期 BETWEEN '2020-08-01' and '2020-09-31'
GROUP BY DATE_FORMAT(a.日期,'%Y-%m')
) as t

  查詢結果如下:
在這裏插入圖片描述

2.3 分別提取司機數大於20,司機總在線時長大於2小時,訂單量大於1,乘客數大於1的城市名稱數據

1.司機數大於20的城市名稱

  解題思路:(1)司機數大於20,可以直接使用count()>20;(2)按照城市名稱進行分組。答案如下:

SELECT b.`城市名稱`,COUNT(DISTINCT a.司機id) as '司機數'
FROM driver as a
LEFT JOIN city as b on a.`城市id`=b.`城市id`
GROUP BY b.`城市名稱`
HAVING COUNT(DISTINCT a.司機id)>20;

  結果如下:
在這裏插入圖片描述

2.查詢各司機總在線時長大於2小時的城市名稱,司機id和總在線時長

  解題思路:(1)司機總在線時長大於2小時,可以直接使用sum()>2;(2)按照司機id進行分組。答案如下:

SELECT c.`城市名稱`,a.`司機id`,a.總在線時長
FROM
(SELECT 司機id,SUM(在線時長) as '總在線時長'
FROM online_time
GROUP BY 司機id
HAVING SUM(在線時長)>2) as a
LEFT JOIN driver as b on a.`司機id`=b.`司機id`
LEFT JOIN city as c on b.`城市id`=c.`城市id`;

  部分查詢結果如下:
在這裏插入圖片描述

3.查詢各司機訂單量大於1的城市名稱,司機id,訂單量

  解題思路:先根據司機id查詢出訂單量大於1的司機id,然後再連接另外兩張表。

SELECT c.`城市名稱`,a.`司機id`,a.訂單量
FROM
(SELECT 司機id,COUNT(DISTINCT 訂單id) as '訂單量'
FROM order_info 
GROUP BY 司機id
HAVING COUNT(DISTINCT 訂單id)>1) as a
LEFT JOIN driver as b on a.`司機id`=b.`司機id`
LEFT JOIN city as c on b.`城市id`=c.`城市id`;

  查詢結果如下:
在這裏插入圖片描述
4.查詢出每位司機所載的乘客數大於1的司機id,乘客數以及所在的城市名稱

  解題思路和前面的類似

SELECT a.`司機id`,a.乘客數,c.`城市名稱`
FROM
(SELECT 司機id,COUNT(DISTINCT 乘客id) as 乘客數
FROM order_info
GROUP BY 司機id
HAVING COUNT(DISTINCT 乘客id)>1) as a
LEFT JOIN driver as b on a.`司機id`=b.`司機id`
LEFT JOIN city as c on b.`城市id`=c.`城市id`;

  查詢結果如下:
在這裏插入圖片描述
  總結:該例子是根據某個公衆號發的數據和他的業務需求進行整理的,可能與公衆號的解題思路不太一樣。文章中若有寫錯的地方,或者可以優化的地方,希望大家能幫我指出來,大家一起努力,一起進步呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章