코딩테스트/MySQL

[LeetCode] 262. Trips and Users

swwho 2025. 4. 29. 22:55
728x90
반응형

🔗 Problem Link

https://leetcode.com/problems/trips-and-users/description/


❔Thinking

  • 2013-10-01와 2013-10-03 사이의 cancellation rate를 각 일자별로 계산한 테이블을 반환한다.
    • cancellation rate = banned 되지 않은 user 가운데에 calleced 되지 않은 상태의 비율
Input: 
Trips table:
+----+-----------+-----------+---------+---------------------+------------+
| 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 table:
+----------+--------+--------+
| 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 |
+----------+--------+--------+
Output: 
+------------+-------------------+
| Day        | Cancellation Rate |
+------------+-------------------+
| 2013-10-01 | 0.33              |
| 2013-10-02 | 0.00              |
| 2013-10-03 | 0.50              |
+------------+-------------------+

💻Solution

SELECT 
    t.request_at AS Day,
    ROUND(
        SUM(t.status IN ('cancelled_by_driver', 'cancelled_by_client')) / COUNT(*), 
        2
    ) AS `Cancellation Rate`
FROM Trips t
JOIN Users uc ON t.client_id = uc.users_id AND uc.banned = 'No'
JOIN Users ud ON t.driver_id = ud.users_id AND ud.banned = 'No'
WHERE t.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY t.request_at

🗝️keypoint

  1. IN 조건에 맞다면 1을 반환하기 때문에, IF 없이도 SUM으로 그 행의 개수를 구할 수 있다.