tak's data blog

LeetCode 문제풀이 (262) 본문

SQL

LeetCode 문제풀이 (262)

hyuntaek 2022. 6. 26. 18:57
반응형
SMALL

 

 

이번 문제를 풀면서 테스트케이스는 다맞췄는데 실제로 제출해보니 정답이 아니였다.

#262

# Write your MySQL query statement below
WITH A as (
SELECT 
    t.request_at as 'Arequest', 
    count(t.request_at) as 'Acount'
FROM 
    Trips t 
    join
    Users u on t.client_id = u.users_id
WHERE u.banned != "Yes"
GROUP BY t.request_at
)
,B as (
SELECT 
    t.request_at as 'Brequest', 
    count(t.status) as 'Bcount'
FROM 
    Trips t
    join
    Users u on t.client_id = u.users_id
WHERE 
    t.status like "completed"
    and
    u.banned != "Yes"
    and 
    t.status not like "cancelled%"
GROUP BY t.request_at
)


SELECT A.Arequest as "Day", ROUND(1-Bcount/Acount,2) as "Cancellation Rate"
FROM A
    join
    B on A.Arequest = B.Brequest
GROUP BY A.Arequest
ORDER BY A.Arequest

내가봐도 너무 비효율적으로 코드를 짜버렸다. with에 전체count테이블, completion칼럼 count테이블 2개를 만들어서 join하였다. 테스트케이스는 통과가 가능했지만 주어진 조건 1개를 덜써서 실제제출에는 틀린답으로 나왔다.

 

다시 효율적인 코드로 제대로 풀어서 수정답안을 올려야겠다...

 

아래와 같은 코드가 with없이 바로 rate를 계산할 수 있는 효율적인 코드이다.

SELECT 
    t.request_at as "Day",
    -- Cancellation Rate를 case when으로 조건을 주어 바로 계산을 해버렸다.
    -- with 대신 효율적인 코드
    ROUND(
        count(
            CASE WHEN 
                t.status != "completed" THEN 1 
                ELSE NULL END) / count(id), 2) as "Cancellation Rate"
FROM
    Trips t
    join 
    Users u1   -- 여기선 Users테이블과 Trips테이블 결합에 외래키가 2개 적용되므로 u1, u2테이블 활용
    on 
    t.client_id = u1.users_id
    and 
    u1.banned != "Yes"
    join
    Users u2
    on 
    t.driver_id = u2.users_id
    and 
    u2.banned != "Yes"
    AND     
    t.request_at BETWEEN '2013-10-01' 
                         AND '2013-10-03'
GROUP BY
    t.request_at

case when을 활용하여 바로 계산했다는 점과 Users테이블을 u1, u2 2번 사용해서 해결한점이 포인트인 것 같다.

반응형
LIST