如何计算分组最大值?SQL分组查询结果异常求助
解决GROUP BY后商品与最大购买量不匹配的问题
嘿,你碰到了SQL分组查询里的一个经典坑!咱们先捋清楚问题出在哪,再给你靠谱的解决方案。
问题根源
你写的SELECT Category, Products, MAX(Purchases) FROM myTable GROUP BY Category; 逻辑有个漏洞:当只按Category分组时,数据库只会保证MAX(Purchases)是该分类下的最大值,但Products列因为没在分组字段里,数据库会随便返回该分类里某一行的商品值(比如很多数据库默认返回分组里的第一条记录,这就是你看到A和A的原因),它不会自动关联到对应最大购买量的那个商品。
两种高效解决方案
方案1:用窗口函数(推荐给支持的数据库,比如MySQL8+、PostgreSQL、SQL Server)
窗口函数能轻松帮我们给每个分类下的记录按购买量排序,然后挑出排第一的那条:
WITH ranked_products AS ( SELECT Category, Products, Purchases, -- 按分类分组,购买量降序排,给每条记录标序号 ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Purchases DESC) AS row_rank FROM myTable ) SELECT Category, Products, Purchases FROM ranked_products WHERE row_rank = 1;
要是同一个分类里有多个商品购买量并列最高,ROW_NUMBER()会随机选一个;想保留所有并列的,把ROW_NUMBER()换成RANK()就行。
方案2:子查询关联(兼容老版本数据库)
先查出每个分类的最大购买量,再关联原表找到对应的商品:
SELECT t1.Category, t1.Products, t1.Purchases FROM myTable t1 INNER JOIN ( -- 先拿到每个分类的最大购买量 SELECT Category, MAX(Purchases) AS max_purchase FROM myTable GROUP BY Category ) t2 ON t1.Category = t2.Category AND t1.Purchases = t2.max_purchase;
这个方法会返回所有并列最高的行,要是只需要一行,可以加个额外的排序或筛选条件。
测试结果验证
用你的测试数据跑上面任意一种方法,都能得到你想要的结果:
1 | B | 13 2 | C | 3
内容的提问来源于stack exchange,提问作者catzen
相关产品推荐
相关产品推荐

