SQL如何获取两列唯一组合且每个组合取第三列最小值?
方案1:GROUP BY 聚合(仅需col1、col2、diff三列时使用)
直接对col1和col2分组,用MIN()聚合函数取每组diff的最小值即可,这是最简单的实现方式,代码如下:
SELECT col1, col2, MIN(diff) AS diff FROM 你的表名 GROUP BY col1, col2;
方案2:窗口函数(需取最小diff对应整行记录时使用)
如果你的表除了这三列还有其他字段需要保留,推荐用ROW_NUMBER()窗口函数实现,主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)均支持:
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY diff ASC) AS rn FROM 你的表名 ) SELECT col1, col2, diff -- 此处可新增你需要的其他字段 FROM ranked_records WHERE rn = 1;
如果同一col1、col2组合存在多条diff相同的最小值记录,需要全部保留的话,将ROW_NUMBER()替换为RANK()即可。
方案3:关联子查询(兼容不支持窗口函数的低版本数据库)
如果你使用的是不支持CTE和窗口函数的低版本数据库(比如MySQL 5.x),可以用子查询先查出每组最小diff,再关联原表取对应记录:
SELECT t1.* FROM 你的表名 t1 INNER JOIN ( SELECT col1, col2, MIN(diff) AS min_diff FROM 你的表名 GROUP BY col1, col2 ) t2 ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.diff = t2.min_diff;
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

