♟️ 알고리즘/Leetcode

[MySQL][Leet Code] 262. Trips and Users (Hard)

Jerry_K 2025. 3. 8. 10:26

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


🗒️SQL 코드 풀이 1

SELECT 
    T1.request_at AS Day,
    ROUND( SUM(CASE WHEN status = "completed" THEN 0 ELSE 1 END) / COUNT(*),2) AS "Cancellation Rate"
    FROM Trips T1
    LEFT JOIN Users U1
        ON T1.client_id= U1.users_id 
    LEFT JOIN Users U2
        ON T1.driver_id= U2.users_id 
    WHERE U1.banned <> "YES" 
        AND U2.banned <> "YES" 
        AND T1.request_at BETWEEN "2013-10-01" AND "2013-10-03"
    GROUP BY T1.request_at
    ORDER BY T1.request_at

 

1. SQL은 차근 차근 원하는 데이터를 출력하면서 합치고 빼고를 반복하면 된다.

 

2. 이번 문제는 Hard였지만, 어려운 문제는 아니였다 .

 

3. 먼저 Trip 테이블과 User 테이블을 합쳐야하는데, client와 driver에 따라 나눠져서 LEFT JOIN을 두번 해주었다.

  • 항상 말하지만, SQL은 행 기반으로 데이터를 처리하여 행 비교 할 수 있게 만들어줘야 한다.

4. U1, U2로 각각 별칭을 부여하고, banned이 "YES"인 것을 걸러준다 .

 

5. 그 다음으로는 coloumn BETWEEN a AND b 함수를 사용해서 문제에서 요구하는 날짜로 필터링한다.

 

6. 이후 GROUP BY와 ORDER BY를 진행하고, SELECT 부분에 CASE WHEN을 적절히 쓰면 끝이다.

 

 

📌 문제 코멘트 

해당 문제를 포스팅하는 이유는 다음과 같다

  • column BETWEEN a AND b 함수를 잘 못씀 
  • 난이도 HARD여도 쫄 필요 없음 ! 
  • Alias (별칭) 쓸 때, 띄어쓰기 있는 경우 따옴표로 처리 

📚문제