1407. 排名靠前的旅行者

1407. 排名靠前的旅行者

表:Users

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| id | int |
| name | varchar |
±--------------±--------+
id 是该表中具有唯一值的列。
name 是用户名字。

表:Rides

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| id | int |
| user_id | int |
| distance | int |
±--------------±--------+
id 是该表中具有唯一值的列。
user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。

编写解决方案,报告每个用户的旅行距离。

返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。

返回结果格式如下例所示。

示例 1:

输入:
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 是排名靠前的旅行者,因为他的名字在字母表上的排序比 Lee 更小。
Bob, Jonathan, Alex 和 Alice 只有一次行程,我们只按此次行程的全部距离对他们排序。
Donald 没有任何行程, 他的旅行距离为 0。

-- Write your PostgreSQL query statement below
-- Write your PostgreSQL query statement below
select a.name,coalesce(sum(b.distance),0) travelled_distance
from Users a left join Rides b 
on a.id=b.user_id 
group by a.name,a.id
order by travelled_distance desc,a.name asc;

select a.name, coalesce(sum(b.distance), 0) travelled_distance

这行代码选择了两个字段:a.name和coalesce(sum(b.distance), 0)。其中,a.name是用户表(Users)中的用户名,coalesce(sum(b.distance), 0)是计算用户的总骑行距离。如果用户没有骑行记录,则默认为0。
from Users a left join Rides b

这行代码指定了查询的数据来源,即Users表和Rides表。这里使用了左连接(left join),意味着会返回所有的用户,无论他们是否有骑行记录。
on a.id = b.user_id

这是连接条件,指定了如何将Users表和Rides表关联起来。这里是通过用户ID(a.id和b.user_id)进行关联。
group by a.name

这行代码指定了按照用户名进行分组,意味着查询结果中每个用户名只会出现一次,并且与之相关联的骑行距离会被累加。
order by travelled_distance desc, a.name asc

这行代码指定了查询结果的排序方式。首先按照骑行距离降序排列,意味着骑行距离最长的用户会排在前面;如果两个用户的骑行距离相同,则按照用户名升序排列。
综上所述,这段SQL查询的目的是检索所有用户的姓名以及他们的总骑行距离,并按照骑行距离降序、用户名升序的方式排列结果。如果用户没有骑行记录,则他们的骑行距离默认为0。

你可能感兴趣的:(数据库,算法,postgresql)