1.題目基本信息
1.1.題目描述
表:Trips
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| id | int |
| client_id | int |
| driver_id | int |
| city_id | int |
| status | enum |
| request_at | varchar |
+-------------+----------+
id 是這張表的主鍵(具有唯一值的列)。
這張表中存所有出租車的行程信息。每段行程有唯一 id ,其中 client_id 和 driver_id 是 Users 表中 users_id 的外鍵。
status 是一個表示行程狀態的枚舉類型,枚舉成員為(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’) 。
表:Users
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| users_id | int |
| banned | enum |
| role | enum |
+-------------+----------+
users_id 是這張表的主鍵(具有唯一值的列)。
這張表中存所有用戶,每個用戶都有一個唯一的 users_id ,role 是一個表示用戶身份的枚舉類型,枚舉成員為 (‘client’, ‘driver’, ‘partner’) 。
banned 是一個表示用戶是否被禁止的枚舉類型,枚舉成員為 (‘Yes’, ‘No’) 。
取消率 的計算方式如下:(被司機或乘客取消的非禁止用戶生成的訂單數量) / (非禁止用戶生成的訂單總數)。
編寫解決方案找出 "2013-10-01" 至 "2013-10-03" 期間有 至少 一次完整行程的非禁止用戶(乘客和司機都必須未被禁止)的 取消率。非禁止用戶即 banned 為 No 的用戶,禁止用戶即 banned 為 Yes 的用戶。其中取消率 Cancellation Rate 需要四舍五入保留 兩位小數 。
返回結果表中的數據 無順序要求 。
1.2.題目地址
https://leetcode.cn/problems/trips-and-users/description/
2.解題方法
2.1.解題思路
按日期進行分組聚合
2.2.解題步驟
第一步,根據user_id、client_id、driver_id,將Users表格連接到Trips表格中,得到表格T1
第二步,T1的基礎上使用request_at日期進行分組聚合,統計每組中SUM(client_banned="No" AND driver_banned='No' AND status!="completed")/SUM(client_banned="No" AND driver_banned='No')的比例,記為rate
第三步,從T2中篩選出rate非NULL的記錄,即為題解
3.解題代碼
sql代碼
# Write your MySQL query statement below# 思路:按日期進行分組聚合WITH T1 AS (# 第一步,根據user_id、client_id、driver_id,將Users表格連接到Trips表格中,得到表格T1SELECT client_id, driver_id, status, request_at, u1.banned AS client_banned, u2.banned AS driver_bannedFROM TripsLEFT JOIN Users AS u1 ON Trips.client_id = u1.users_idLEFT JOIN Users AS u2 ON Trips.driver_id = u2.users_id
), T2 AS (# 第二步,T1的基礎上使用request_at日期進行分組聚合,統計每組中SUM(client_banned="No" AND driver_banned='No' AND status!="completed")/SUM(client_banned="No" AND driver_banned='No')的比例,記為rateSELECT request_at AS Day, ROUND(SUM(client_banned = "No" AND driver_banned = 'No' AND status != "completed") / SUM(client_banned = "No" AND driver_banned = 'No'), 2) AS rateFROM T1WHERE request_at >= '2013-10-01' AND request_at <= '2013-10-03'GROUP BY request_at
)# 第三步,從T2中篩選出rate非NULL的記錄,即為題解
SELECT Day, rate AS 'Cancellation Rate'
FROM T2 WHERE rate IS NOT NULL;