如何用SQL返回各部门最大值对应的行,包含同值多行?
解决每个部门保留Value最大值所有行的SQL问题
你的原SQL语句通过GROUP BY分组后,仅能返回每组的聚合结果,无法保留所有符合条件的原始行——尤其是当同一部门存在多条Value等于最大值的记录时,会丢失这些数据。以下提供两种可行的解决方案:
方案一:使用窗口函数(推荐,适配多数现代数据库)
利用RANK()窗口函数对每个部门的记录按Value降序排名,筛选出排名为1的所有行(所有Value等于最大值的记录都会被标记为排名1)。
SELECT Name, Code, Date, Value FROM ( SELECT Name, Code, Date, Value, -- 按部门(Name+Code)分组,按Value降序排名 RANK() OVER (PARTITION BY Name, Code ORDER BY Value DESC) AS rank_num FROM Department ) ranked_data WHERE rank_num = 1;
如果你的数据库支持DENSE_RANK(),也可以替换RANK(),效果在这个场景下一致。
方案二:子查询关联法(兼容旧版数据库)
先通过子查询计算每个部门的最大Value,再将原表与该子查询关联,筛选出Value等于对应部门最大值的所有行。
SELECT d.Name, d.Code, d.Date, d.Value FROM Department d INNER JOIN ( -- 计算每个部门的最大Value SELECT Name, Code, MAX(Value) AS max_value FROM Department GROUP BY Name, Code ) dept_max ON d.Name = dept_max.Name AND d.Code = dept_max.Code AND d.Value = dept_max.max_value;
原SQL问题说明
原SQL中GROUP BY Name, Code后,MAX(Date)仅取该部门的最新日期,MAX(Value)取该部门的最大Value,但这两个聚合值可能来自不同的原始行,且无法保留多个Value等于最大值的记录,因此无法满足需求。
内容的提问来源于stack exchange,提问作者KikiZ
相关产品推荐
相关产品推荐

