SQL如何按b列分组取每组c列值最小的对应整行数据
解法1:全数据库兼容写法(支持所有SQL版本)
通过子查询先拿到每个b分组的最小c值,再和原表关联匹配得到完整行:
SELECT t.a, t.b, t.c FROM 你的表名 t INNER JOIN ( -- 先按b分组计算每组最小c值 SELECT b, MIN(c) AS min_c FROM 你的表名 GROUP BY b ) t_min ON t.b = t_min.b AND t.c = t_min.min_c;
如果同一个分组下有多行c值同为最小值,该写法会返回所有符合条件的行。
解法2:窗口函数写法(支持MySQL 8.0+、PostgreSQL、SQL Server、Oracle等新版本数据库)
用ROW_NUMBER窗口函数给分组内的行按c值升序排序,取排序第一的行即可:
SELECT a, b, c FROM ( SELECT a, b, c, -- 按b分组,组内按c升序排序打序号 ROW_NUMBER() OVER (PARTITION BY b ORDER BY c ASC) AS rn FROM 你的表名 ) tmp WHERE rn = 1;
如果需要返回同一个分组下所有c值最小的行,把ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者ozzem
相关产品推荐
相关产品推荐

