1. 數據說明
數據來源於滴滴打車的數據,爲了方便,只截取了一部分數據。現有四張表,分別是“司機數據”表,“訂單數據”表,“在線時長數據”表,“城市匹配數據”表。
- 司機數據表
- 訂單數據表
- 在線時長數據表
- 城市匹配數據表
2. 業務需求
2.1 分析出2020年8月各城市每天的司機數、快車訂單量和快車流水數據
思路:
“2020年8月”,可以用where + between and 函數來對時間進行條件限制
“各城市”,城市在“城市匹配數據“表中,可以用“城市“來分組(group by)
“每天的XX”, 對於“每天”這樣的問題,用“日期“來分組(group by),統計可以用sum/ count函數
2.1.1 2020年8月各城市每天的司機數
select
b.城市名稱,
a.日期,
count(distinct 司機id) as 司機數
from
司機數據 as a
left join
城市匹配數據 as b
on a.城市id=b.城市id
where
日期 BETWEEN '2020-08-01' and '2020-08-31'
group by
a.城市id,
a.日期
運行結果
2.1.2 2020年8月各城市每天的快車訂單量
select
c.城市名稱,
a.日期,
count(a.訂單id) as 快車訂單量
from
訂單數據 as a
left join
司機數據 as b
on a.司機id=b.司機id
left join
城市匹配數據 c
on b.城市id= c.城市id
where
a.日期 between '2020-08-01' and '2020-08-31'
and a.產品線id=3
group by
c.城市名稱,
a.日期
運行結果:
2.1.3 2020年8月各城市每天的快車流水
select
c.城市名稱,
a.日期,
sum(a.流水) as 快車流水
from
訂單數據 as a
left join
司機數據 as b
on a.司機id=b.司機id
left join
城市匹配數據 c
on b.城市id= c.城市id
where
a.日期 between '2020-08-01' and '2020-08-31'
and a.產品線id=3
group by
b.城市id,
a.日期
運行結果:
2.2 分析出2020年8月和9月,每個月的北京市新老司機(首單日期在當月爲新司機)的司機數、在線時長和TPH(訂單量/在線時長)數據
2.2.1 2020年8月和9月,每個月的北京市新司機的司機數
通過遞進的方式求解,先求 每個月的司機數,再求 新司機
- 每個月的司機數
select
month(日期) as 月份 ,
count(司機id) as 司機數
from
司機數據
group by
month(日期)
運行結果
- 從表中找到新司機,添加篩選條件
select
month(日期) as 月份 ,
count(司機id) as 新司機數
from
司機數據
where
year(首次完成訂單時間)=year(日期)
and month(首次完成訂單時間)=month(日期)
and( 日期 between '2020-08-01' and '2020-08-31'
or 日期 between '2020-09-01' and '2020-09-31')
and 城市id='100000'
group by
date_format(日期,'%Y-%m')
運行結果:
2.2.2 2020年8月和9月,每個月的北京市新司機的在線時長
對於在線時長的計算,用到 “ 在線時長數據” 表。“每個月”按月份分組(group by),在線時長的總長利用sum(在線時長)來計算。新司機表中並沒有在線時長數據,
select
date_format(a.日期,'%Y-%m') as 年月,
sum(b.在線時長) as 新司機在線時長
from
(select
*
from
司機數據
where
year(首次完成訂單時間)=year(日期)
and month(首次完成訂單時間)=month(日期)
and( 日期 between '2020-08-01' and '2020-08-31'
or 日期 between '2020-09-01' and '2020-09-31')
and 城市id='100000'
) as a
left join 在線時長數據 as b
on a.司機id=b.司機id
group by
年月
運行結果
2.2.3 2020年8月和9月,每個月的北京市新司機的TPH(訂單量/在線時長)
在線時長已經求出,這裏只需求解訂單量了。訂單量的計算,會用到 “訂單數據” 表,用count(訂單id)來計算。
select
date_format(a.日期,'%Y-%m') as 年月,
count(b.訂單id) as 訂單量
from
(select
*
from
司機數據
where
year(首次完成訂單時間)=year(日期)
and month(首次完成訂單時間)=month(日期)
and( 日期 between '2020-08-01' and '2020-08-31'
or 日期 between '2020-09-01' and '2020-09-31')
and 城市id='100000'
) as a
left join 訂單數據 as b
on a.司機id=b.司機id
group by
年月
運行結果:
2.2.4 如何求老司機人數
把等於換成不等於, and 換成 or
year(首次完成訂單時間) <> year(日期)
or month(首次完成訂單時間) <> month(日期)
2.3 分別提取司機數大於20,司機總在線時長大於2小時,訂單量大於1,乘客數大於1的城市名稱數據
2.3.1 司機數大於20的城市名稱
司機id 位於司機數據表中, 城市名稱位於城市匹配數據表中,
司機數大於20可以使用 having + sum函數
select
b.城市名稱,
a.司機數
from
(
select
城市id,
count(司機id) as 司機數
from
司機數據
group by
城市id
having count(司機id)>20
) as a
left join
(
select
城市id,
城市名稱
from
城市匹配數據
)as b
on b.城市id=a.城市id
運行結果:
2.3.2 司機總在線時長大於2小時城市名稱
總在線時長位於在線時長數據表中,城市名稱位於城市匹配數據表中,這兩個表之間沒有交集,所以需要一箇中間表(司機數據表)來連接兩表。
時長大於2小時 可以使用having篩選,sum 函數求和。
select
a.司機id,
a.總在線時長,
c.城市名稱
from
(
(
select
司機id,
sum(在線時長) as 總在線時長
from 在線時長數據
group by 司機id
having sum(在線時長)>2
) as a
left join
(
select
司機id,
城市id
from
司機數據
) as b
on a.司機id=b.司機id
join 城市匹配數據 as c
on b.城市id=c.城市id
)
運行結果:
2.3.3 訂單量大於1的城市名稱
訂單量位於訂單數據表中,城市名稱位於城市匹配數據中,兩表沒有交集,需要中間表司機數據表
select
a.司機id,
a.訂單量,
c.城市名稱
from
(
(
select
司機id,
count(訂單id) as 訂單量
from
訂單數據
group by
司機id
having
訂單量>1
) as a
left join
(
select
司機id,
城市id
from
司機數據
) as b
on a.司機id = b.司機id
join 城市匹配數據 as c
on b.城市id= c.城市id
)
運行結果:
2.3.4 乘客數大於1的城市名稱
乘客數可以從訂單數據表,通過count(乘客id)來計算,城市名稱位於城市匹配數據中,兩表沒有交集,需要中間表司機數據表
select
a.司機id,
a.乘客數,
c.城市名稱
from
(
(
select
司機id,
count(乘客id) as 乘客數
from
訂單數據
group by
司機id
having
乘客數>1
) as a
left join
(
select
司機id,
城市id
from
司機數據
) as b
on a.司機id = b.司機id
join 城市匹配數據 as c
on b.城市id= c.城市id
)
運行結果:
3 數據可視化(Excel)
對2中提取出的數據使用透視表,進一步可視化 ,
不同城市的司機數:
不同時間的司機人數
個城市司機人數佔比