SQL使用GROUP BY结合MIN/MAX聚合时如何保留其余关联列数据
GROUP BY关联非聚合字段获取最低销售额对应行的实现方案
以下提供两种常用实现方式,可根据你使用的数据库版本选择:
方案一:窗口函数实现(兼容MySQL8.0+、PostgreSQL、SQL Server、Oracle等主流数据库)
- 实现逻辑:使用
ROW_NUMBER()窗口函数按人员ID、NAME分区,按销售额升序排序,每个分区内排序第一的记录即为最低销售额对应的记录,直接筛选即可。
SELECT ID, NAME, REGION, SALES, QTR FROM ( SELECT ID, NAME, REGION, SALES, QTR, -- 按人员分组,销售额从小到大排序 ROW_NUMBER() OVER (PARTITION BY ID, NAME ORDER BY SALES ASC) AS rn FROM 你的表名 -- 替换为实际业务表名 ) t WHERE rn = 1;
如果同一个人员存在多条相同最低销售额的记录,需要全部返回的话,把ROW_NUMBER()替换为RANK()即可。
方案二:自连接实现(兼容低版本数据库如MySQL5.x)
- 实现逻辑:先通过子查询得到每个人员的最低销售额,再和原表关联,匹配人员ID、NAME和销售额等于最低销售额的记录,即可拿到对应的REGION、QTR信息。
SELECT t1.ID, t1.NAME, t1.REGION, t1.SALES, t1.QTR FROM 你的表名 t1 -- 替换为实际业务表名 INNER JOIN ( -- 先查询每个人员的最低销售额 SELECT ID, NAME, MIN(SALES) AS min_sales FROM 你的表名 -- 替换为实际业务表名 GROUP BY ID, NAME ) t2 ON t1.ID = t2.ID AND t1.NAME = t2.NAME AND t1.SALES = t2.min_sales;
注意:如果同一个人员有多条相同最低销售额的记录,该查询会返回所有匹配行,若仅需返回任意一条,可根据业务需求额外加排序和筛选条件。
内容的提问来源于stack exchange,提问作者tsoverflow
相关产品推荐
相关产品推荐

