You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算分组最大值?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:37