https://leetcode.cn/problems/trips-and-users/description/
虽然说是困难题,但实际上只是写起来很长很麻烦而已。
黑名单的客户和司机都需要被排除出结果集,麻烦的是黑名单只给了个users_id,而这个users_id包含了客户和司机的id。所以我想的是直接两次left join完事,省事。
然后就是IF的用法,不知道能用“或”符号的话写起来还是挺麻烦的。
SQL
# Write your MySQL query statement below
SELECT A.request_at AS 'Day',
ROUND(
COUNT(IF(status='cancelled_by_driver'||status='cancelled_by_client',1,NULL))
/
COUNT(A.status),2
) AS 'Cancellation Rate'
FROM Trips AS A
LEFT JOIN Users AS B
ON A.client_id = B.users_id
LEFT JOIN Users AS C
ON A.driver_id = C.users_id
WHERE B.banned!='Yes' AND C.banned!='Yes'
AND A.request_at <='2013-10-03' AND A.request_at >='2013-10-01'
GROUP BY A.request_at
题外话,我又和我一年前提交的代码对比了一下,发现自己以前写的是什么🐕💩
SQL
# Write your MySQL query statement below
SELECT A.request_at AS Day
,ROUND((COUNT(IF(A.status='cancelled_by_client',1,NULL))
+COUNT(IF(B.status='cancelled_by_driver',1,NULL))
)/COUNT(A.id),2)AS 'Cancellation Rate'
FROM(
SELECT id,request_at,client_id,banned,status
FROM Trips
LEFT JOIN Users
ON client_id=users_id
WHERE banned='NO'
)A
JOIN(
SELECT id,request_at,driver_id,banned,status
FROM Trips AS B
LEFT JOIN Users AS C
ON driver_id=users_id
WHERE banned='NO'
)B
ON A.id=B.id
WHERE A.request_at<='2013-10-03'
AND A.request_at>='2013-10-01'
GROUP BY A.request_at