如何为每个唯一键A选取对应B值最小的单行数据
解决方案
方法1:使用窗口函数(推荐,支持现代数据库)
窗口函数ROW_NUMBER()可以轻松实现分组取top1的需求,适用于MySQL 8.0+、PostgreSQL、SQL Server等数据库:
SELECT A, B, C FROM ( SELECT *, -- 按A分组,每组内按B升序编号 ROW_NUMBER() OVER (PARTITION BY A ORDER BY B ASC) AS row_num FROM entry ) AS temp -- 取每组的第一行(B最小的行) WHERE row_num = 1;
方法2:GROUP BY + 关联查询(兼容旧版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先分组找到每个A对应的最小B,再关联原表获取完整行数据:
SELECT e.* FROM entry e INNER JOIN ( -- 先分组计算每个A的最小B SELECT A, MIN(B) AS min_B FROM entry GROUP BY A ) AS t ON e.A = t.A AND e.B = t.min_B;
方法3:关联子查询
通过子查询直接判断当前行的B是否为对应A的最小值:
SELECT * FROM entry e WHERE B = ( SELECT MIN(B) FROM entry WHERE A = e.A );
内容的提问来源于stack exchange,提问作者lightyears
相关产品推荐
相关产品推荐

