tak's data blog
LeetCode 문제풀이 (262) 본문
이번 문제를 풀면서 테스트케이스는 다맞췄는데 실제로 제출해보니 정답이 아니였다.
#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번 사용해서 해결한점이 포인트인 것 같다.
'SQL' 카테고리의 다른 글
LeetCode 문제풀이 (1393, 1407, 1484, 1581) (1) | 2022.07.01 |
---|---|
LeetCode 문제풀이 (626, 1158) (0) | 2022.06.27 |
LeetCode 문제풀이 (184, 185) (0) | 2022.06.26 |
LeetCode 문제풀이 (176, 178, 180, 181, 182, 183) (1) | 2022.06.24 |
[SQL] HackerRank - Ollivander's Inventory (0) | 2022.06.05 |