문제링크
기억하면 좋을 것
select request_at day
,round(sum(case when status = 'cancelled_by_driver' or status = 'cancelled_by_client' then 1 else 0 end)
/ (count(id) * 1.00),2) 'Cancellation Rate'
from Trips t
where request_at between '2013-10-01' and '2013-10-03'
and client_id in (select users_id from Users where banned = 'No')
and driver_id in (select users_id from Users where banned = 'No')
group by request_at
취소된 request / 전체 request 계산해주기위해서 취소된 갯수 세는 테이블, 전체 갯수 세는 테이블 나눠서 join 해서 계산했는데 생각해보니 위 풀이처럼 case when 해서 맞으면 1 틀리면 0 해서 더해주면 되는거였다
저게 내꺼보다 50% 빠르다. 저 방법을 잘 기억하자
소감
ban 되지 않은 사용자를 찾으려고 두번이나 같은 테이블 조인을 했는데 다른 사람이 푼거 보니까 그냥 서브쿼리 써서 where 절 안에 in 으로 넣어준다. 이게 더 빠르고 좋은 것 같다.
서브쿼리를 안 잘써봐서 아직 감이 잘 안오는데 이런식으로 계속 연습하면 될것같다.
업무를 위해 hard 난이도를 계속 연습해야겠다.
해결 코드
/* Write your T-SQL query statement below */
-- 1. Trips 과 Users 를 Join 해서 banned 가 No 인걸 뺀다
-- 2. 그걸 기준으로 Count(status = canceleed) / count(*) 한다.
with tb as
(
Select id, client_id, driver_id, status, t.request_at AS request_at
From Trips t
Left outer join (Select users_id, banned From Users Where role = 'client') uc
On t.client_id = uc.users_id
Left outer join (Select users_id, banned From Users Where role = 'driver') ud
On t.driver_id = ud.users_id
Where uc.banned <> 'Yes' and ud.banned <> 'Yes' and t.request_at between '2013-10-01' and '2013-10-03'
)
Select total.request_at AS 'Day', ROUND(ISNULL(cancelled_cnt*1.0,0)/total_cnt * 1.0, 2) AS 'Cancellation Rate'
From (
Select request_at , Count(*) AS total_cnt
From tb
Group by request_at
) AS total
Left Outer Join (
Select request_at , Count(*) AS cancelled_cnt
From tb
Where substring(status,1,9) = 'cancelled'
Group by request_at
) AS cancelled
On total.request_at = cancelled.request_at
Submission Detail
'알고리즘 > leetcode' 카테고리의 다른 글
[Leetcode/C#] 530. Minimum Absolute Difference in BST (0) | 2024.08.17 |
---|---|
[LeetCode/C#] 374. Guess Number Higher or Lower (0) | 2024.05.04 |
[LeetCode/MSSQL] 1327. List the Products Ordered in a Period (1) | 2024.01.28 |
[LeetCode/MSSQL] 196. Delete Duplicate Emails (1) | 2024.01.28 |
[Leetcode/JS] 226. Invert Binary Tree (0) | 2023.07.18 |
댓글