리트코드 : 1407. Top Travellers
문제
Table: Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id is the column with unique values for this table.
name is the name of the user.
Table: Rides
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| user_id | int |
| distance | int |
+---------------+---------+
id is the column with unique values for this table.
user_id is the id of the user who traveled the distance "distance".
Write a solution to report the distance traveled by each user.
Return the result table ordered by travelled_distance in descending order, if two or more users traveled the same distance, order them by their name in ascending order.
The result format is in the following example.
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 |
+----------+--------------------+
Explanation:
Elvis and Lee traveled 450 miles, Elvis is the top traveler as his name is alphabetically smaller than Lee.
Bob, Jonathan, Alex, and Alice have only one ride and we just order them by the total distances of the ride.
Donald did not have any rides, the distance traveled by him is 0.
유저별 라이딩 정보 합계 후 정렬기준 맞춰서 반환하기
문제 풀이
MySQL
select users.name, coalesce(temp.dist,0) as travelled_distance
from users
left join
(select *, sum(distance) as dist
from rides
group by user_id) as temp
on temp.user_id = users.id
order by temp.dist desc, users.name
- cte나 서브쿼리 쓰는게 조금 느리긴 한데 가독성 면이나 생각의 순서가 보여서 좀 더 편하다.
- left join에서 발생하는 null값은 coalesce로 처리
Pandas
import pandas as pd
def top_travellers(users: pd.DataFrame, rides: pd.DataFrame) -> pd.DataFrame:
grouped = rides.groupby('user_id').agg(
travelled_distance = ('distance','sum')
).reset_index()
joined = pd.merge(grouped, users, how='right', left_on='user_id', right_on='id')
joined['travelled_distance'].fillna(0,inplace=True)
joined.sort_values(['travelled_distance','name'], ascending=[0,1], inplace=True)
return joined[['name','travelled_distance']]
- agg로 컬럼명 바꾸면서 유저 별 합계 구한다.
- 컬럼명이 다르니 left right on을 통해서 join
- null값 처리는 fillna
- 정렬기준 맞춰서 출력
코멘트
- .
'Data Analysis > Query' 카테고리의 다른 글
리트코드 : 1527. Patients With a Condition (0) | 2024.08.31 |
---|---|
리트코드 : 1581. Customer Who Visited but Did Not Make Any Transactions (0) | 2024.08.31 |
리트코드 : 1517. Find Users With Valid E-Mails (0) | 2024.08.29 |
리트코드 : 1393. Capital Gain/Loss (0) | 2024.08.14 |
리트코드 : 1378. Replace Employee ID With The Unique Identifier (0) | 2024.08.13 |
리트코드 : 1341. Movie Rating (0) | 2024.08.11 |
리트코드 : 1327. List the Products Ordered in a Period (0) | 2024.08.10 |
댓글