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。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!