Table: Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id는 이 테이블에서 고유한 값을 가진 열입니다. name은 사용자의 이름입니다.
Table: Rides
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| user_id | int |
| distance | int |
+---------------+---------+
id는 이 테이블에서 고유한 값을 가진 열입니다. user_id는 "distance" 거리를 이동한 사용자의 id입니다.
문제
각 사용자가 이동한 거리의 보고서를 작성하세요.
결과 테이블은 이동한 거리(travelled_distance)를 내림차순으로 정렬하고, 두 명 이상의 사용자가 동일한 거리를 이동한 경우 이름을 오름차순으로 정렬하세요.
결과 형식은 아래 예시와 같습니다.
Example 1:
Input:
Users table:
+------+-----------+
| id | name |
+------+-----------+
| 1 | Alice |
| 2 | Bob |
| 3 | Alex |
| 4 | Donald |
| 7 | Lee |
| 13 | Jonathan |
| 19 | Elvis |
+------+-----------+
Rides table:
+------+----------+----------+
| 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 |
+------+----------+----------+
Output:
+----------+--------------------+
| name | travelled_distance |
+----------+--------------------+
| Elvis | 450 |
| Lee | 450 |
| Bob | 317 |
| Jonathan | 312 |
| Alex | 222 |
| Alice | 120 |
| Donald | 0 |
+----------+--------------------+
설명 : Elvis와 Lee는 각각 450마일을 이동했으며, Elvis가 이름이 알파벳 순으로 더 작기 때문에 가장 많은 거리를 이동한 사람으로 간주됩니다. Bob, Jonathan, Alex, Alice는 각각 한 번의 여행만 했으며, 우리는 그들의 총 이동 거리로만 정렬합니다. Donald는 여행이 없었으므로 이동한 거리는 0입니다.
✏️ 풀이
import pandas as pd
def top_travellers(users: pd.DataFrame, rides: pd.DataFrame) -> pd.DataFrame:
df = rides.groupby('user_id')['distance'].sum().reset_index(name='travelled_distance')
result = pd.merge(df, users, how='right', left_on='user_id', right_on='id').fillna(0)
return result[['name', 'travelled_distance']].sort_values(by=['travelled_distance', 'name'], ascending=[False, True])
지금까지 공부한 내용으로 충분히 풀 수 있는 문제여서 어렵지 않게 풀 수 있었다