SQL查询问题:同一ID下选取Col2值更大的行
解决重复ID下选取Col2最大值行的SQL方案
嘿,这个需求太常见了!我来给你几个实用的解法,覆盖不同的场景和数据库版本。先再明确下你的问题场景:
数据表中存在多行相同ID的记录,需要为每个ID仅保留Col2值最大的那一行。示例数据如下:
ID Col2 123 1 123 2 1234 2 12345 3 预期输出:
ID Col2 123 2 1234 2 12345 3
方法1:基础GROUP BY + 聚合函数
如果你的需求只需要ID和Col2这两个字段,这个方法最简单直接:
SELECT ID, MAX(Col2) AS Col2 FROM your_table_name GROUP BY ID;
原理:用GROUP BY ID把相同ID的记录归为一组,再通过MAX(Col2)提取每组里的最大Col2值,一步到位得到结果。
方法2:窗口函数(推荐,支持多字段保留)
如果你的表还有其他字段需要一起查询,窗口函数会更灵活,这里用ROW_NUMBER()举例:
WITH ranked_data AS ( SELECT ID, Col2, -- 这里可以添加你需要保留的其他字段 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Col2 DESC) AS rn FROM your_table_name ) SELECT ID, Col2 -- 同步添加其他需要的字段 FROM ranked_data WHERE rn = 1;
原理:
PARTITION BY ID按ID分组,ORDER BY Col2 DESC让每组内Col2最大的行排在最前面ROW_NUMBER()给每组内的行分配一个序号,序号为1的就是我们要的目标行
小提示:如果同一个ID下有多个行的Col2值相同且都是最大值,想要保留所有这些行的话,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行。
方法3:子查询关联(兼容旧版数据库)
如果你的数据库不支持窗口函数(比如一些老版本的MySQL),可以用子查询关联的方式:
SELECT t1.ID, t1.Col2 FROM your_table_name t1 INNER JOIN ( SELECT ID, MAX(Col2) AS max_col2 FROM your_table_name GROUP BY ID ) t2 ON t1.ID = t2.ID AND t1.Col2 = t2.max_col2;
原理:先通过子查询找出每个ID对应的最大Col2值,再把这个结果和原表关联,匹配出ID相同且Col2等于最大值的行。
内容的提问来源于stack exchange,提问作者Cory
相关产品推荐
相关产品推荐

