如何查询各省份中各产品的最高收入值?
解决每个省份下每个产品的最高收入查询问题
首先,我先理清楚你的需求和现有SQL的问题,再给出对应解决方案:
你的原SQL问题分析
你尝试的SQL语句其实做了重复工作:
SELECT PRODUCT, PROVINCE, MAX(TOTAL) FROM ( SELECT PRODUCT, PROVINCE, SUM(INCOME) TOTAL FROM SALES GROUP BY PRODUCT,PROVINCE ) GROUP BY PRODUCT,PROVINCE;
内层子查询已经按PRODUCT和PROVINCE分组,算出了每个产品在对应省份的收入总和TOTAL。外层再对同样的分组取MAX(TOTAL)完全没有意义——因为每个分组只有一个TOTAL值,MAX结果就是它本身,相当于直接查询内层子查询的结果,并没有实现“最高收入值”的预期逻辑。
针对不同需求的解决方案
我分两种常见的需求场景给你对应SQL:
场景1:查询每个省份下,每个产品的单笔最高收入
如果你的需求是每个产品在某个省份里的最大单笔收入(比如Apple在Seville地区的单笔最高收入是13.2),直接分组取MAX即可,不需要求和:
SELECT PRODUCT, PROVINCE, MAX(INCOME) AS MAX_SINGLE_INCOME FROM SALES GROUP BY PRODUCT, PROVINCE;
场景2:查询每个省份下,收入总和最高的产品
如果你的需求是找出每个省份中,收入总和最高的产品及其总和(比如Almeria地区收入最高的产品是Melon,总和3.6),可以用窗口函数RANK()来实现:
WITH PRODUCT_PROV_TOTAL AS ( SELECT PRODUCT, PROVINCE, SUM(INCOME) AS TOTAL_INCOME, -- 按省份分组,对收入总和降序排名 RANK() OVER (PARTITION BY PROVINCE ORDER BY SUM(INCOME) DESC) AS RANK_NUM FROM SALES GROUP BY PRODUCT, PROVINCE ) SELECT PRODUCT, PROVINCE, TOTAL_INCOME FROM PRODUCT_PROV_TOTAL WHERE RANK_NUM = 1;
这个SQL会返回每个省份中收入总和最高的产品,如果有多个产品总和并列第一,所有符合条件的产品都会被返回。
内容的提问来源于stack exchange,提问作者Juan Antonio González Rivera
相关产品推荐
相关产品推荐

