SQL查询如何对重复姓名数据去重并保留对应年龄的最大值
解决方案
方案1:基础聚合查询(最常用,仅需获取分组和最大值时优先用)
直接用GROUP BY配合MAX()聚合函数即可实现需求,SQL语句如下:
SELECT name, MAX(age) AS age FROM 你的表名 GROUP BY name;
逻辑为按name分组,每组内取age的最大值返回,完全匹配你给出的场景要求。
方案2:窗口函数(灵活度最高,需要获取最大值对应行的其他字段时用)
如果除了name和最大age外,还需要获取该行的其他字段数据,可以使用ROW_NUMBER()窗口函数实现:
WITH ranked_data AS ( SELECT name, age, -- 此处可添加其他需要查询的字段 ROW_NUMBER() OVER (PARTITION BY name ORDER BY age DESC) AS rank_num FROM 你的表名 ) SELECT name, age -- 此处可添加其他需要返回的字段 FROM ranked_data WHERE rank_num = 1;
如果同name下有多条相同最大age的记录需要全部保留,将ROW_NUMBER()替换为RANK()即可。
方案3:关联子查询(适配不支持窗口函数的低版本SQL环境)
SELECT t1.name, t1.age FROM 你的表名 t1 LEFT JOIN 你的表名 t2 ON t1.name = t2.name AND t1.age < t2.age WHERE t2.name IS NULL;
逻辑为找到同name分组下,不存在比当前记录age更大的记录,即为分组内的最大值记录。
内容的提问来源于stack exchange,提问作者stackword_0
相关产品推荐
相关产品推荐

