Sql力扣算法:262. 行程和用户

题目描述:

SQL架构
表:Trips
在这里插入图片描述

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

表:Users
在这里插入图片描述

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

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

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

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

查询结果格式如下例所示。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trips-and-users
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

案例:

在这里插入图片描述

解决方案:

/* Write your T-SQL query statement below */

select a.request_at Day,Convert(decimal(12,2),Convert(decimal(12,2),isnull(b.num,0)) / Convert(decimal(12,2),isnull(a.num,1))) as [Cancellation Rate] from 	--取消率
    (select a.request_at,count(1) num 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 <> 'Yes' and c.banned <> 'Yes'
    group by a.request_at) a    
    left join ( select a.request_at,count(1) num 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 <> 'Yes' and c.banned <> 'Yes' and a.status <> 'completed'
    group by a.request_at) b 
    on a. request_at = b.request_at
where a.request_at >= '2013-10-01' and a.request_at < '2013-10-04'

提交结果:

在这里插入图片描述

解题思路:

1.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,根据日期group by,获得日期总订单数,日期,封装成子查询表T1。

2.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,并且订单状态不等于完成,根据日期group by,获得日期总有效用户取消订单数,日期,封装成子查询表T2。

3.根据日期关联有效总订单T1表和有效取消订单T2表,Convert(decimal(12,2),isnull(T2有效取消订单数,0)) / Convert(decimal(12,2),isnull(T1总有效订单数,1))) as [Cancellation Rate]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值