본문 바로가기
알고리즘/leetcode

[LeetCode/MSSQL] 262. Trips and Users

by 질서정연_ 2024. 4. 6.

 

문제링크 

262. Trips and Users

 
 
 
 

기억하면 좋을 것 

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

 

 

댓글