[LeetCode] 262. Trips and Users

2022. 12. 8. 02:07TIL💡/Database

Hard 문제라 그런지 푸는 데 한참 더 걸렸다..ㅠ

그리고 예상치 못한 변수들이 자주 등장했다.

Common Table Expressions(CTE)를 만들어서 banned되지 않은 user만 추출해놓는다.

이를 이용해 client_id, driver_id가 banned되지 않은 유저에 해당하는 row만 추출하려고 했다.

그런데 동일한 CTE를 이용하면 안되고 각각 다른 유저 테이블로 속함 여부를 판단해야한다. 안그러면 제대로 작동하지 않는다.

(아무래도 하나의 테이블에서 하나의 row를 내부적으로 가리켜야하는 거 같다.)

 

그리고 날짜 구간을 위해 리트코드에서는 처음으로 BETWEEN을 써주어서 풀 수 있었다.

 

WITH NOT_BANNED_USERS AS (
    SELECT users_id
    FROM Users
    WHERE banned = 'No'
)

SELECT
t2.request_at AS Day,
ROUND(
        (
            SELECT COUNT(t1.id)
            FROM Trips t1, NOT_BANNED_USERS u1, NOT_BANNED_USERS u2
            WHERE t1.status <> 'completed' 
            AND t1.request_at = Day 
            AND t1.client_id IN (u1.users_id)
            AND t1.driver_id IN (u2.users_id)
        )
    / COUNT(t2.id)
, 2) AS 'Cancellation Rate'
FROM Trips t2
INNER JOIN NOT_BANNED_USERS u3
ON u3.users_id = t2.client_id
INNER JOIN NOT_BANNED_USERS u4
ON u4.users_id = t2.driver_id
WHERE t2.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY Day