Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 262

262. Trips and Users

문제

  • 택시 운행 데이터 중 취소율을 출력
  • 유저 중에서 밴당한 유저는 제외
  • 실패는 cancel by driver, cancle by client
  • 요청 범위는 2013-10-01~2013-10-03
  • 소수점 2자리까지만 출력
문제 접근

  • 밴당한 유저를 join으로 묶어서 vs cte subquery를 사용하여 제외
  • 취소 당한 유저는 completed를 제외한 모든 값
  • 소수점 예외 처리를 위해 decimal 처리
  • 0으로 나눌 일은 존재하지 않아 별도의 예외처리를 하여주지 않아도 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with normal_user as (
    select
        users_id
    from Users
    where banned = 'No'
)
select 
    request_at Day,
    cast( sum(status <> 'completed') / count(*) as decimal(3,2)) 'Cancellation Rate'
from trips
where 1=1
    and request_at >= '2013-10-01'
    and request_at < '2013-10-04'
    and client_id in (select users_id from normal_user) 
    and driver_id in (select users_id from normal_user)
group by 1
order by 1
코드 리뷰

  • join 사용 시 약간의 속도 개선이 있었으나, 속도는 거의 동일하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
    request_at Day,
    cast(sum(status <> 'completed')/ count(*) as decimal(3,2)) 'Cancellation Rate'
from Trips
inner join Users client
    on Trips.client_id = client.users_id
        and client.banned = 'No'
inner join Users driver
    on Trips.driver_id = driver.users_id
        and driver.banned = 'No'
where request_at >= '2013-10-01'
    and request_at < '2013-10-04'
group by 1
order by 1;