📝 1407. Top Travellers
🔹 최고의 여행자
각 사용자가 이동한 거리를 보고하는 솔루션을 작성하세요.
travelled_distance 기준으로 정렬된 결과 테이블을 내림차순으로 반환하고, 두 명 이상의 사용자가 동일한 거리를 이동한 경우 이름을 기준으로 오름차순으로 정렬합니다.
📝 문제 설명
Top Travellers(1407번) 문제는 사용자가 이동한 총 거리를 계산하여 순위를 매기는 문제입니다. 각 사용자의 이동 거리 합계를 계산하고, 이동 거리 기준으로 내림차순으로 정렬합니다. 만약 이동 거리가 동일한 사용자가 있다면 이름 기준 오름차순으로 정렬합니다.
📊 테이블 구조
Users 테이블
Column Name | Type |
id | int |
name | varchar |
Rides 테이블
Column Name | Type |
id | int |
user_id | int |
distance | int |
- id는 테이블의 PK 입니다.
- user_id는 distance거리를 이동한 사용자의 id입니다.
💡 SQL 문제 해결 방법
- JOIN을 사용하여 Users 테이블과 Rides 테이블을 연결합니다.
- SUM 함수를 사용하여 사용자가 이동한 총거리를 계산합니다.
- IFNULL 또는 COALESCE 함수를 사용하여 이동 기록이 없는 사용자의 거리를 0으로 반환합니다.
- GROUP BY 절을 사용하여 사용자별로 이동 거리를 집계합니다.
- ORDER BY 절을 사용하여 이동 거리 기준 내림차순 정렬 후, 같은 거리는 이름 기준 오름차순으로 정렬합니다.
728x90
🖥️ SQL 풀이
SELECT a.name
, IFNULL(SUM(b.distance), 0) AS travelled_distance
FROM Users a
LEFT JOIN Rides b
ON a.id = b.user_id
GROUP BY a.id
ORDER BY travelled_distance DESC
, a.name
🔍 쿼리 분석
- LEFT JOIN을 사용하여 Users 테이블의 모든 사용자 정보를 포함합니다.
- SUM(b.distance)를 사용하여 사용자가 이동한 총 거리를 계산합니다.
- 이동 기록이 없는 사용자는 IFNULL 함수를 사용하여 이동 거리를 0으로 반환합니다.
- 결과는 이동 거리 기준 내림차순, 이름 기준 오름차순으로 정렬됩니다.
📌 실행 예제
📊 입력 데이터
Users 테이블
id | name |
1 | Alice |
2 | Bob |
3 | Alex |
4 | Donald |
7 | Lee |
13 | Jonathan |
19 | Elvis |
Rides 테이블
id | user_id | distance |
1 | 1 | 120 |
2 | 2 | 317 |
3 | 3 | 222 |
4 | 7 | 100 |
5 | 13 | 312 |
6 | 19 | 50 |
7 | 7 | 120 |
8 | 19 | 400 |
9 | 7 | 230 |
쿼리 실행 결과
name | travelled_distance |
Elvis | 450 |
Lee | 450 |
Bob | 317 |
Jonathan | 312 |
Alex | 222 |
Alice | 120 |
Donald | 0 |
- Elvis와 Lee는 각각 450마일을 이동했으며, 이름 순으로 정렬되어 Elvis가 1위입니다.
- Bob, Jonathan, Alex, Alice는 각각 한 번의 이동만 기록되었고 이동 거리 순으로 정렬됩니다.
- Donald는 이동 기록이 없어 이동 거리 0으로 표시됩니다.
🎯 결론
이 문제는 JOIN 절과 집계 함수를 활용하여 데이터 집계를 수행하는 방법을 연습할 수 있습니다. 이동 거리 계산과 정렬 조건을 함께 적용하여 SQL의 다양한 기능을 익힐 수 있습니다.
더 많은 SQL 문제 풀이를 보고 싶다면 LeetCode SQL 문제 모음을 확인해 보세요! 🚀
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode] 1667. Fix Names in a Table (0) | 2025.03.10 |
---|---|
[LeetCode] 1587. Bank Account Summary 2 (0) | 2025.03.10 |
[LeetCode] 1179. Reformat Department Table (0) | 2025.03.05 |
[LeetCode] 1084. Sales Analysis 3 (2) | 2025.03.05 |
[LeetCode] 1050. Actors and Directors Who Cooperated At Least Three Times (2) | 2025.03.04 |