You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:48:02