본문 바로가기
[코딩 테스트]/SQL 코딩 테스트

[LeetCode] 262. Trips and Users

by icepack788 2024. 2. 16.

 

Trips and Users - LeetCode

Can you solve this real interview question? Trips and Users - Table: Trips +-------------+----------+ | Column Name | Type | +-------------+----------+ | id | int | | client_id | int | | driver_id | int | | city_id | int | | status | enum | | request_at |

leetcode.com

 

문제) 취소율은 금지되지 않은 사용자가 있는 취소된(클라이언트별 또는 드라이버별) 요청의 수를 해당일의 금지되지 않은 사용자가 있는 요청의 총 수로 나누어 계산됩니다. "2013-10-01"에서 "2013-10-03" 사이의 금지되지 않은 사용자(클라이언트와 드라이버 모두 금지되지 않아야 함)가 있는 요청의 취소율을 찾기 위한 솔루션을 매일 작성하십시오. (소수점 두 개까지) 순서에 상관없이 결과 테이블을 반환합니다.

답)

SELECT request_at Day
      , ROUND(COUNT(CASE WHEN status <> 'completed' THEN id END) / COUNT(id), 2) 'Cancellation Rate'
FROM trips
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

 

 개념정리

1. 원하는 기간의 결과를 구하기 위해 BETWEEN A AND B 사용

2. banned된 사용자는 집계에서 제외하기 위해 다중행 서브쿼리를 사용

➡️ users 테이블에서 banned가 NO인 사용자의 users_id를 구하고, 해당 id가 trips 테이블의 client_id, driver_id에 banned가 안된 인원만 집계

3. 취소율을 구하기 위해 (status가 completed가 아닌 id의 수 / 전체 id의 수)를 해준 후 소수점 자리를 맞추어주기 위해 ROUND 사용

📍본 내용은 데이터리안 'SQL 데이터 분석 캠프 실전반' 을 수강하며 작성한 내용입니다.

 

 

 

반응형

댓글