KEEP GOING

[MySQL] LeetCode : Trips and Users (NOT IN) 본문

code review/sql

[MySQL] LeetCode : Trips and Users (NOT IN)

jmHan 2022. 4. 8. 10:36
반응형

https://leetcode.com/problems/trips-and-users/

 

Trips and Users - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

[서브쿼리 사용]

SELECT request_at Day
      ,ROUND(COUNT(IF(status != 'completed', TRUE, NULL))/COUNT(*), 2)'Cancellation Rate'
FROM Trips
WHERE client_id NOT IN (SELECT users_id FROM Users WHERE banned = 'Yes')
      AND driver_id NOT IN (SELECT users_id FROM Users WHERE banned = 'Yes')
      AND request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY request_at

Users 테이블에서 users_id는 primary key이기에 NOT IN 사용시 NULL 처리 필요 없음

COUNT 집계함수 안에 IF 문 사용 가능

 

[틀린 코드]

SELECT T.request_at Day
      ,ROUND(COUNT(IF(T.status != 'completed', TRUE, NULL))/COUNT(*), 2)'Cancellation Rate'
FROM Trips T INNER JOIN Users U ON T.client_id = U.users_id
WHERE U.banned != 'Yes' AND T.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY T.request_at

틀린 이유) INNER JOIN을 통해 Trips 테이블과 Users 테이블을 연결해줌으로써 banned = 'No'인 client_id는 필터링할 수 있었지만 banned = 'Yes'인 driver_id를 처리할 수 없어 문제가 되었다. 

다음과 같이 데이터가 들어올 경우, driver_id = 10은 banned 처리 되어 있기에 행 자체가 카운팅 되면 안되는데

취소율을 구할때 분모로 카운팅되어 오답처리 되었다. 따라서 위 정답 코드 처럼 

driver_id NOT IN (SELECT users_id FROM Users WHERE banned = 'Yes') 와 같이

서브쿼리로 필터링해줌으로써 해결할 수 있다. 

반응형

'code review > sql' 카테고리의 다른 글

[MySQL] LeetCode : Tree Node (NOT IN)  (0) 2022.04.07
[MySQL] LeetCode : Market Analysis  (0) 2022.04.07
[MySQL] 3주차 (for coding test)  (0) 2022.03.07
[MySQL] 2주차  (0) 2022.03.06
[MySQL] 1주차  (0) 2022.02.28
Comments