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;