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
相关产品推荐
相关产品推荐

