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 (별칭) 쓸 때, 띄어쓰기 있는 경우 따옴표로 처리
📚문제
'♟️ 알고리즘 > Leetcode' 카테고리의 다른 글
[MySQL][Leet Code] 185. Department Top Three Salaries (Hard) (0) | 2025.03.08 |
---|---|
[MySQL][Leet Code]180. Consecutive Numbers (Medium) (0) | 2025.03.07 |
[MySQL][Leet Code] 1789. Primary Department for Each Employee (Easy) (0) | 2025.03.07 |
[MySQL][Leet Code] 619. Biggest Single Number (0) | 2025.03.05 |
[MySQL][Leet Code] 1070. Product Sales Analysis III (Medium) (0) | 2025.03.05 |