如何在带INNER JOIN的Oracle SQL SELECT语句中实现MAX筛选?
解决融资方案使用次数最大值筛选问题(支持并列)
我来帮你搞定这个需求——要找出使用次数最多的融资方案(包括并列情况,不用LIMIT),你之前的思路跑偏在直接在HAVING里用MAX函数,但MAX在HAVING里是作用于分组内而非全局,所以达不到效果。下面给你两种靠谱的实现方式:
方法1:先统计次数,再匹配全局最大值
先用CTE(公共表表达式)算出每个方案的使用次数,再通过子查询拿到全局最大次数,最后筛选出次数等于最大值的记录:
WITH plan_usage AS ( SELECT fp.institution, fp.loanType, fp.planID, COUNT(sf.planID) AS usage_count FROM FINANCING_PLANS fp INNER JOIN SALES_FINANCINGS sf ON fp.planID = sf.planID GROUP BY fp.institution, fp.loanType, fp.planID ) SELECT * FROM plan_usage WHERE usage_count = (SELECT MAX(usage_count) FROM plan_usage);
这种方法兼容性好,几乎所有支持CTE的数据库都能跑(如果你的数据库不支持CTE,也可以把CTE换成子查询嵌套)。
方法2:用窗口函数快速筛选排名第一的方案
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用RANK()或DENSE_RANK()会更简洁:
SELECT institution, loanType, planID, usage_count FROM ( SELECT fp.institution, fp.loanType, fp.planID, COUNT(sf.planID) AS usage_count, -- RANK()会给相同次数的方案都标记为第1名 RANK() OVER (ORDER BY COUNT(sf.planID) DESC) AS usage_rank FROM FINANCING_PLANS fp INNER JOIN SALES_FINANCINGS sf ON fp.planID = sf.planID GROUP BY fp.institution, fp.loanType, fp.planID ) ranked_plans WHERE usage_rank = 1;
这里RANK()的作用是按使用次数倒序排名,所有并列第一的方案都会被标记为usage_rank = 1,直接筛选这个条件就能得到目标结果。
为什么你之前的尝试失败?
- 直接在
HAVING里写COUNT(...) = MAX(...):MAX()在HAVING子句中是针对当前分组的聚合,不是全局的最大值,所以无法匹配到全局最高次数。 - 用
MAX(SALES_FINANCINGS.planID)替换COUNT:这是取planID字段的最大值,和使用次数完全无关,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者StevenC
相关产品推荐
相关产品推荐

