如何用SQL查询累计出行距离Top50的用户
原有SQL的错误点
- 表关联条件错误:Rides表通过
user_id字段关联Users表的主键id,原写法写的t1.id = t2.id是关联两张表的主键,会导致关联结果完全错误。 - 排序逻辑不全:需求要求累计距离相同的情况下按用户名升序排列,原ORDER BY子句缺少这一排序规则。
- 未给聚合计算的累计距离字段设置别名,返回结果的列语义不清晰。
- 不需要使用
PARTITION相关的窗口函数:当前需求是全局维度聚合后取排名前50的记录,直接用GROUP BY聚合+TOP取数即可,窗口函数更适用于分组内排名(比如每个城市取出行距离前10的用户)的场景,这里用反而会增加不必要的计算开销。
修正后的SQL语句
SELECT TOP 50 t1.name AS [用户姓名(user name)], SUM(t2.distance) AS 累计出行距离 FROM Users t1 INNER JOIN Rides t2 ON t1.id = t2.user_id GROUP BY t1.name ORDER BY SUM(t2.distance) DESC, t1.name ASC
逻辑说明
- 修正后的关联条件可以正确匹配每个用户对应的所有出行记录
SUM(t2.distance)按用户分组聚合,计算每个用户的累计出行距离- 排序规则先按累计出行距离降序,同距离下按用户名升序,完全匹配需求要求
TOP 50会严格返回排序后的前50条记录,自动忽略末位的并列情况,符合需求约束
内容的提问来源于stack exchange,提问作者valera_177
相关产品推荐
相关产品推荐

