sql4

Trips and Users

此题有困难,需要学习相关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’).


+----+-----------+-----------+---------+--------------------+----------+
| 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’).

+----------+--------+--------+
| 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 
clients 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.

+------------+-------------------+
|     Day    | Cancellation Rate |
+------------+-------------------+
| 2013-10-01 |       0.33        |
| 2013-10-02 |       0.00        |
| 2013-10-03 |       0.50        |
+------------+-------------------+


#1.SELECT * FROM Trips LEFT JOIN Users ON Trips.client_id = Users.users_id ORDER BY request_at 数据预处理
#2.SELECT id,client_id,status,request_at,banned, 筛选数据,获取counter 和request_at
SELECT request_at AS Day, round((max(counter)*1.0/count(request_at)),2) AS "Cancellation Rate"  
FROM(  
    SELECT id,client_id,status,request_at,banned,  
        @counter := if (@curDate=request_at AND status <> 'completed', @counter+1, 0) ,  
        @counter := if (@curDate<>request_at AND status <> 'completed', 1, @counter) AS counter,  
        @curDate := request_at AS curDate  
    FROM (SELECT * FROM Trips LEFT JOIN Users ON Trips.client_id = Users.users_id ORDER BY request_at) as tmp0,  
        (SELECT @counter := 0, @curDate := '') as parameters  
    WHERE banned <> 'Yes' AND request_at >= '2013-10-01' AND request_at <= '2013-10-03'  
    ) AS tmp  
GROUP BY request_at 
select request_at,round(sum(case when status="completed" then 0 else 1 end)/count(*),2)
from  (select * from Trips  
where client_id not in 
(select users_id from Users where banned = "yes" and role = "client") and request_at >= "2013-10-01" and request_at <= "2013-10-03") t  
group by request_at order by request_at asc 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容