【力扣白嫖日记】262.行程和用户

前言

练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。

今日题目:

262.行程和用户
表:Trips

列名类型
idint
client_idint
deriver_idint
city_idint
statusenum
request_atdate

id 是这张表的主键(具有唯一值的列)。这张表中存所有出租车的行程信息。每段行程有唯一 id ,其中 client_id 和 driver_id 是 Users 表中 users_id 的外键。status 是一个表示行程状态的枚举类型,枚举成员为(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’) 。

表:Users

列名类型
users_idint
brandenum
roleenum

users_id 是这张表的主键(具有唯一值的列)。这张表中存所有用户,每个用户都有一个唯一的 users_id ,role 是一个表示用户身份的枚举类型,枚举成员为 (‘client’, ‘driver’, ‘partner’) 。banned 是一个表示用户是否被禁止的枚举类型,枚举成员为 (‘Yes’, ‘No’) 。

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

编写解决方案找出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户(乘客和司机都必须未被禁止)的取消率。非禁止用户即 banned 为 No 的用户,禁止用户即 banned 为 Yes 的用户。其中取消率 Cancellation Rate 需要四舍五入保留 两位小数 。

返回结果表中的数据 无顺序要求 。


我那不值一提的想法:

  • 首先梳理表内容,题干一共给了一张行程表,一张用户表,行程表记录了行程id,客户id,司机id,城市id,行程状态(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)
    #以及响应日期。一张用户表,记录了用户id,用户身份(‘client’, ‘driver’, ‘partner’),以及用户是否被禁止
  • 其次分析需求,需要找到 “2013-10-01” 至 “2013-10-03” 期间非禁止用户(乘客和司机都必须未被禁止)的取消率。
  • 对于这道题我认为首先找到禁止用户,也就是banned = "yes"的用户
select users_id 
from Users 
where banned = "yes"
  • 在找到了所有禁止用户后,我们后面查询的时候就可以加上条件,所有用户id和司机id都不在这个里面
client_id not in (
    select users_id 
    from Users 
    where banned = "yes"
)
and driver_id not in (
    select users_id 
    from Users 
    where banned = "yes"
)
  • 那么就可以开始计算非禁止用户的订单总量
count(status)
  • 非禁止用户的拒绝订单总量
sum(if(status = "completed",0,1))
  • 由于是按照日期查询我们还需要加个整体条件where request_at between "2013-10-01" and "2013-10-03",同时不要忘记了最后使用日期进行分组。
  • 到这里,所有步骤完整,将所有代码拼接成完整代码,
select request_at as 'Day',round(sum(if(status = "completed",0,1))/count(status),2) as 'Cancellation Rate'
from Trips
where request_at between "2013-10-01" and "2013-10-03"
and client_id not in (
    select users_id 
    from Users 
    where banned = "yes"
)
and driver_id not in (
    select users_id 
    from Users 
    where banned = "yes"
)
group by request_at

结果:

在这里插入图片描述


总结:

能运行就行。


  • 51
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值