如何按ID和Name分组计算score总和并取每个ID前2高结果
你可以通过窗口函数快速实现该需求,目前MySQL 8.0+、PostgreSQL、SQL Server、Oracle等主流数据库均支持该语法:
WITH group_score AS ( -- 按ID、Name分组计算score总和 SELECT ID, Name, SUM(score) AS total_score FROM 替换为你的实际表名 GROUP BY ID, Name ), rank_result AS ( -- 按ID分组对总得分降序排名 SELECT *, RANK() OVER (PARTITION BY ID ORDER BY total_score DESC) AS score_rank FROM group_score ) -- 筛选每个ID排名前2的结果 SELECT ID, Name, total_score FROM rank_result WHERE score_rank <= 2;
你可以根据实际需求选择排名函数:
- 用
RANK():同分并列,后续排名跳过占位(比如两个第1名,下一个就是第3名),所有并列的前2名都会返回 - 用
ROW_NUMBER():同分也按顺序分配唯一排名,不会出现并列,固定返回每个ID下2条结果 - 用
DENSE_RANK():同分并列,后续排名不跳过占位(比如两个第1名,下一个是第2名)
如果你使用的是不支持窗口函数的低版本MySQL(5.7及以下),可以用关联子查询实现:
SELECT t1.ID, t1.Name, t1.total_score FROM ( SELECT ID, Name, SUM(score) AS total_score FROM 替换为你的实际表名 GROUP BY ID, Name ) t1 WHERE ( SELECT COUNT(DISTINCT t2.total_score) FROM ( SELECT ID, Name, SUM(score) AS total_score FROM 替换为你的实际表名 GROUP BY ID, Name ) t2 WHERE t2.ID = t1.ID AND t2.total_score >= t1.total_score ) <= 2 ORDER BY t1.ID, t1.total_score DESC;
内容的提问来源于stack exchange,提问作者Hoàng Thông Nguyễn
相关产品推荐
相关产品推荐

