当前位置: 首页 > news >正文

SQL-leetcode-262. 行程和用户

262. 行程和用户

表: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:

输入:
Trips 表:
±—±----------±----------±--------±--------------------±-----------+
| id | client_id | driver_id | city_id | status | request_at |
±—±----------±----------±--------±--------------------±-----------+
| 1 | 1 | 10 | 1 | completed | 2013-10-01 |
| 2 | 2 | 11 | 1 | cancelled_by_driver | 2013-10-01 |
| 3 | 3 | 12 | 6 | completed | 2013-10-01 |
| 4 | 4 | 13 | 6 | cancelled_by_client | 2013-10-01 |
| 5 | 1 | 10 | 1 | completed | 2013-10-02 |
| 6 | 2 | 11 | 6 | completed | 2013-10-02 |
| 7 | 3 | 12 | 6 | completed | 2013-10-02 |
| 8 | 2 | 12 | 12 | completed | 2013-10-03 |
| 9 | 3 | 10 | 12 | completed | 2013-10-03 |
| 10 | 4 | 13 | 12 | cancelled_by_driver | 2013-10-03 |
±—±----------±----------±--------±--------------------±-----------+
Users 表:
±---------±-------±-------+
| users_id | banned | role |
±---------±-------±-------+
| 1 | No | client |
| 2 | Yes | client |
| 3 | No | client |
| 4 | No | client |
| 10 | No | driver |
| 11 | No | driver |
| 12 | No | driver |
| 13 | No | driver |
±---------±-------±-------+
输出:
±-----------±------------------+
| Day | Cancellation Rate |
±-----------±------------------+
| 2013-10-01 | 0.33 |
| 2013-10-02 | 0.00 |
| 2013-10-03 | 0.50 |
±-----------±------------------+
解释:
2013-10-01:

  • 共有 4 条请求,其中 2 条取消。
  • 然而,id=2 的请求是由禁止用户(user_id=2)发出的,所以计算时应当忽略它。
  • 因此,总共有 3 条非禁止请求参与计算,其中 1 条取消。
  • 取消率为 (1 / 3) = 0.33
    2013-10-02:
  • 共有 3 条请求,其中 0 条取消。
  • 然而,id=6 的请求是由禁止用户发出的,所以计算时应当忽略它。
  • 因此,总共有 2 条非禁止请求参与计算,其中 0 条取消。
  • 取消率为 (0 / 2) = 0.00
    2013-10-03:
  • 共有 3 条请求,其中 1 条取消。
  • 然而,id=8 的请求是由禁止用户发出的,所以计算时应当忽略它。
  • 因此,总共有 2 条非禁止请求参与计算,其中 1 条取消。
  • 取消率为 (1 / 2) = 0.50

题解

常言道字多的问题最简单,看这个高难度的问题这么多描述性的词语,肯定就问题不是很大了,从战略上藐视它。
首先咱们看下这个算法是啥?

  • 取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。
    重点是什么呢?
    被xxx取消,非禁止xxx 订单数 / 非禁止订单总数
    那是不是找到被xxx取消的个数+非禁止用户 / 非禁止总数就可以了?

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

找出xxx期间
------ where 条件来了
非禁止用户即 banned 为 No 的用户
禁止用户即 banned 为 Yes 的用户
------ where 条件又来了
取消率 Cancellation Rate 需要四舍五入保留 两位小数
------怎么呈现也来了,round函数一下
于是乎方法一就来了

方法一 sum/count+join

select tmp.request_at as Day,round(sum(if(tmp.status='completed',0,1))/count(1), 2) as 'Cancellation Rate'
from (select t1.*,u1.banned as cbd,u2.banned as dbdfrom Trips t1 join Users u1 on t1.client_id = u1.users_idjoin Users u2 on t1.driver_id = u2.users_id where u1.banned='No' and u2.banned='No'
) tmp
where request_at between '2013-10-01' and '2013-10-03'
group by tmp.request_at

方法二 子查询代替join

简化下第一种方案

select 
Trips.request_at Day,
round(cast(sum(CASE WHEN Trips.status<>'completed' THEN 1 ELSE 0 END) as float)
/count(status),2) as 'Cancellation Rate'
from Trips 
where Trips.driver_id  in (select users_id from Users where banned<>'Yes')and Trips.client_id  in (select users_id from Users where banned<>'Yes')and Trips.request_at>='2013-10-01' and Trips.request_at<='2013-10-03'
group by Trips.request_at

方法三 exists 函数简化下

搞第二种方案以后想到了一个exists函数,搞起

select 
t1.request_at Day,
-- 计算sum/count,把取消的设置为0,完单的设置为1,除以总数
round(cast(sum(CASE WHEN t1.status<>'completed' THEN 1 ELSE 0 END) as float)
/count(status),2) as 'Cancellation Rate'
from Trips t1
where 
-- 有效用户司机
exists (select users_id from Users u1 where banned<>'Yes' and t1.driver_id = u1.users_id)
-- 有效用户乘客and  exists (select users_id from Users u2 where banned<>'Yes' and t1.client_id = u2.users_id)
-- 日期范围and t1.request_at>='2013-10-01' and t1.request_at<='2013-10-03'
group by t1.request_at

其他暂时没想到,够用了先这样吧

http://www.lryc.cn/news/518651.html

相关文章:

  • 太原理工大学软件设计与体系结构 --javaEE
  • Leetcode 139. 单词拆分 动态规划
  • python异常机制
  • 运行爬虫时可能遇到哪些常见问题?
  • BGP与CN2的区别 详解两者在网络传输中的应用与优势
  • Spring 项目 基于 Tomcat容器进行部署
  • “负载均衡”出站的功能、原理与场景案例
  • 02-51单片机数码管与矩阵键盘
  • 不同方式获取音频时长 - python 实现
  • 【python A* pygame 格式化 自定义起点、终点、障碍】
  • 12_Redis发布订阅
  • 归并排序:数据排序的高效之道
  • 【redis初阶】浅谈分布式系统
  • CatLog的使用
  • 头歌python实验:网络安全应用实践-恶意流量检测
  • 大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
  • 如何用 Python 实现简单的 AI 模型?
  • 单片机-直流电机实验
  • python【数据结构】
  • 详解Sonar与Jenkins 的集成使用!
  • 《笔记》青蛙跳台阶——斐波那契数列
  • SpringBoot3动态切换数据源
  • OSPF - 特殊区域
  • Linux 系统下磁盘相关指令:df、du、fdisk、lsblk
  • 基于单片机的肺功能MVV简单测算
  • 如何用Python编程实现自动整理XML发票文件
  • 腾讯云AI代码助手编程挑战赛-百事一点通
  • Spring学习笔记1
  • LeetCode 2185. Counting Words With a Given Prefix
  • 图漾相机基础操作