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

如何在带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:52:56