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

SQL合并聚合单表两列:如何提取总分最高的用户?

解决单表分组求和并找出总分最高用户的方案

嘿,我来帮你搞定这个问题!你的场景很明确:单表里用户的id和name字段互斥(有id则name为空,反之),需要先把同一个用户的所有记录归为一组,计算总分后找出分数最高的用户对吧?

核心思路拆解

首先得解决用户标识统一的问题——因为同一个用户的记录里,要么用id标识,要么用name标识,所以我们需要一个能把两者合并的方法,再基于这个统一标识分组求和,最后筛选出最高分用户。

具体实现方案

这里给你两种常用的写法,你可以根据自己的SQL环境选择:

方法1:用窗口函数(推荐,支持并列第一的场景)

窗口函数RANK()可以轻松处理多个用户总分并列最高的情况,所有第一名都会被返回:

WITH user_totals AS (
    SELECT
        -- 用COALESCE取出非空的用户标识,作为分组依据
        COALESCE(id, name) AS user_key,
        -- 用MAX取出用户的有效id/name(同一用户的记录里要么全空要么有值,MAX会忽略null)
        MAX(id) AS user_id,
        MAX(name) AS user_name,
        SUM(score) AS total_score
    FROM your_table_name
    GROUP BY COALESCE(id, name)
)
SELECT
    user_id,
    user_name,
    total_score
FROM (
    -- 按总分降序排名,排名为1的就是最高分用户
    SELECT
        *,
        RANK() OVER (ORDER BY total_score DESC) AS score_rank
    FROM user_totals
) ranked_users
WHERE score_rank = 1;

方法2:用子查询(兼容不支持窗口函数的旧版SQL)

如果你的SQL环境不支持窗口函数,可以用嵌套子查询先找出最大总分,再筛选对应用户:

SELECT
    MAX(id) AS user_id,
    MAX(name) AS user_name,
    SUM(score) AS total_score
FROM your_table_name
GROUP BY COALESCE(id, name)
-- 筛选出总分等于所有用户中最高总分的记录
HAVING SUM(score) = (
    SELECT MAX(total_score)
    FROM (
        SELECT SUM(score) AS total_score
        FROM your_table_name
        GROUP BY COALESCE(id, name)
    ) user_scores
);

关键细节说明

  • COALESCE(id, name):这个函数会返回参数里第一个非空的值,刚好适配你的id和name互斥的场景,完美统一用户标识。
  • MAX(id)/MAX(name):因为同一用户的所有记录里,id要么全为null要么是同一个值,name同理,用MAX可以轻松拿到用户的有效标识,避免结果里出现null。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:24