能否使用子查询实现按团队统计前三名成员积分总和并排序
问题解决方案
核心结论
该需求完全可以通过子查询实现,以下分别提供子查询实现方案,以及更简洁的标准SQL窗口函数实现方案,兼容MySQL 8.0+、PostgreSQL、SQL Server等主流支持标准SQL的数据库,使用时请将代码中的your_table_name替换为你的实际表名。
方案1:纯子查询实现
SELECT ROW_NUMBER() OVER (ORDER BY SUM(t1.Points) DESC) AS Place, t1.Team, SUM(t1.Points) AS Points FROM your_table_name t1 WHERE ( SELECT COUNT(*) FROM your_table_name t2 WHERE t2.Team = t1.Team AND t2.Points > t1.Points ) < 3 GROUP BY t1.Team ORDER BY Points DESC;
逻辑说明:子查询统计每个用户在所属团队中积分比自己高的人数,人数小于3即对应团队前3名,筛选后按团队分组求和,最后排序生成排名。
方案2:窗口函数实现(更简洁易维护)
WITH ranked_users AS ( SELECT Team, Points, ROW_NUMBER() OVER (PARTITION BY Team ORDER BY Points DESC) AS team_rank FROM your_table_name ) SELECT ROW_NUMBER() OVER (ORDER BY SUM(Points) DESC) AS Place, Team, SUM(Points) AS Points FROM ranked_users WHERE team_rank <= 3 GROUP BY Team ORDER BY Points DESC;
逻辑说明:先通过
ROW_NUMBER()窗口函数按团队分组给用户积分排名,筛选出每个团队排名前3的用户后,分组求和再排序生成排名。如果需要处理并列积分的场景,把ROW_NUMBER()替换为RANK()即可。
运行结果
两种方案执行后都会得到你预期的输出:
| Place | Team | Points |
|---|---|---|
| 1 | B | 85 |
| 2 | A | 78 |
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

