美文网首页
(LeetCode 262) 行程和用户

(LeetCode 262) 行程和用户

作者: lconcise | 来源:发表于2021-06-09 19:35 被阅读0次

表:Trips
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| Id | int |
| Client_Id | int |
| Driver_Id | int |
| City_Id | int |
| Status | enum |
| Request_at | date |
+-------------+----------+
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’) 。

写一段 SQL 语句查出 "2013-10-01" 至 "2013-10-03" 期间非禁止用户(乘客和司机都必须未被禁止)的取消率。非禁止用户即 Banned 为 No 的用户,禁止用户即 Banned 为 Yes 的用户。

取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。

返回结果表中的数据可以按任意顺序组织。其中取消率 Cancellation Rate 需要四舍五入保留 两位小数

解题思路

  1. 条件筛选 (乘客和司机都必须未被禁止)
  2. 条件筛选 2013-10-01 至 2013-10-03 期间
  3. 取消率 (被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。

解题步骤

1. 条件筛选 非禁止用户

SELECT
    a.* 
FROM
    trips a
    LEFT JOIN users b ON a.Client_Id = b.Users_Id
    LEFT JOIN users c ON a.Driver_Id = c.Users_Id 
WHERE
    b.Banned = "No" 
    AND c.Banned = "No";

2. 条件筛选 2013-10-01 至 2013-10-03 期间

SELECT
    a.* 
FROM
    trips a
    LEFT JOIN users b ON a.Client_Id = b.Users_Id
    LEFT JOIN users c ON a.Driver_Id = c.Users_Id 
WHERE
    b.Banned = "No" 
    AND c.Banned = "No" 
    AND ( a.Request_at >= "2013-10-01" AND a.Request_at <= "2013-10-03" );

3. 取消率 (被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。

SELECT
    a.Request_at AS DAY,
    ROUND( sum( a.`Status` != "completed" ) / count( 1 ), 2 ) AS "Cancellation Rate" 
FROM
    trips a
    LEFT JOIN users b ON a.Client_Id = b.Users_Id
    LEFT JOIN users c ON a.Driver_Id = c.Users_Id 
WHERE
    b.Banned = "No" 
    AND c.Banned = "No" 
    AND ( a.Request_at >= "2013-10-01" AND a.Request_at <= "2013-10-03" ) 
GROUP BY
    a.Request_at;

知识点分析

  1. 关联同一张表两次,条件查询
  2. 聚合函数 count() sum() ,sum() 可以传递表达式,count() 不行
  3. round 函数,round(x,d) :x 是要处理的数字,d是要保留的小数点位置

相关文章

网友评论

      本文标题:(LeetCode 262) 行程和用户

      本文链接:https://www.haomeiwen.com/subject/ygwbsltx.html