前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >262. Trips and Users

262. Trips and Users

作者头像
Dylan Liu
发布2019-07-01 12:43:14
3380
发布2019-07-01 12:43:14
举报
文章被收录于专栏:dylanliudylanliu

Description

Difficulty: Hard Tag: Sql

The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are both foreign keys to the Users_Id at the Users table. Status is an ENUM type of (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’).

代码语言:javascript
复制
+----+-----------+-----------+---------+--------------------+----------+
| 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|
+----+-----------+-----------+---------+--------------------+----------+

The Users table holds all users. Each user has an unique Users_Id, and Role is an ENUM type of (‘client’, ‘driver’, ‘partner’).

代码语言:javascript
复制
+----------+--------+--------+
| 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 |
+----------+--------+--------+

Write a SQL query to find the cancellation rate of requests made by unbanned users between Oct 1, 2013 and Oct 3, 2013. For the above tables, your SQL query should return the following rows with the cancellation rate being rounded to two decimal places.

代码语言:javascript
复制
+------------+-------------------+
|     Day    | Cancellation Rate |
+------------+-------------------+
| 2013-10-01 |       0.33        |
| 2013-10-02 |       0.00        |
| 2013-10-03 |       0.50        |
+------------+-------------------+

Solution

201ms:

代码语言:javascript
复制
select a.Request_at Day, round(sum(case when a.status = 'cancelled_by_driver' then 1 when a.status = 'cancelled_by_client' then 1 else 0 end) /count(1), 2) as 'Cancellation Rate'
from trips a 
where exists (select 1 from users u where u.users_id = a.client_id and u.banned='No')
and exists (select 1 from users u where u.users_id = a.driver_id and u.banned='No')
and a.Request_at between '2013-10-01' and '2013-10-03'
group by a.Request_at

198ms:

代码语言:javascript
复制
select a.Request_at Day, round(sum(case when a.status != 'completed' then 1  else 0 end) /count(1), 2) as 'Cancellation Rate'
from trips a 
where exists (select 1 from users u where u.users_id = a.client_id and u.banned='No')
and exists (select 1 from users u where u.users_id = a.driver_id and u.banned='No')
and a.Request_at between '2013-10-01' and '2013-10-03'
group by a.Request_at

178ms:

代码语言:javascript
复制
select a.Request_at Day, round(sum(case when a.status = 'cancelled_by_driver' then 1 when a.status = 'cancelled_by_client' then 1 else 0 end) /count(1), 2) as 'Cancellation Rate'
from trips a 
left join users d on d.users_id = a.client_id
left join users c on c.users_id = a.client_id
where d.banned='No' and c.banned = 'No'
and a.Request_at between '2013-10-01' and '2013-10-03'
group by a.Request_at

170ms:

代码语言:javascript
复制
select a.Request_at Day, round(sum(case when a.status != 'completed' then 1 else 0 end) /count(1), 2) as 'Cancellation Rate'
from trips a 
left join users d on d.users_id = a.client_id
left join users c on c.users_id = a.client_id
where d.banned='No' and c.banned = 'No'
and a.Request_at between '2013-10-01' and '2013-10-03'
group by a.Request_at

从做这道题了解到了一个知识点,在 left join 中,最外层的 where 条件是施加在 (from, left join) 完成之后的表上的,而不是仅仅影响 left join 中的表。

如果只想要影响要left join 的表,有两种办法

  1. 条件加在 on 后面
  2. 临时表,形式为left join (select * fro users u where u.banned = 'No')
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Solution
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档