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

SQL PLUS技术问询:如何仅返回列中最频繁值及关联客户信息

解决SQL中仅返回最高频MAKE及关联客户信息的问题

你的原语句其实已经做到了按MAKE的频率降序排列,但因为把客户信息也加入了GROUP BY,导致每个MAKE+客户的组合都生成了一条记录,而且没办法直接过滤出最高频的MAKE组。下面给你两种实用的修改方案:

方案一:先统计MAKE频次,再筛选最高频记录

这种方法逻辑清晰,适合需要明确看到频次数值的场景,也能处理多个MAKE频次相同的情况:

WITH make_counts AS (
    -- 第一步:统计每个MAKE的总销售次数
    SELECT sv.make, COUNT(*) AS total_sales
    FROM Sales s
    INNER JOIN Sale_Vehicles sv ON s.VIN = sv.VIN
    GROUP BY sv.make
),
max_sales AS (
    -- 第二步:找到最高的销售次数
    SELECT MAX(total_sales) AS highest_count FROM make_counts
)
-- 第三步:关联所有表,筛选出属于最高频MAKE的客户信息
SELECT sv.make, c.first, c.MI, c.last
FROM Sales s
INNER JOIN Sale_Vehicles sv ON s.VIN = sv.VIN
INNER JOIN Customers c ON s.cust_ID = c.cust_ID
INNER JOIN make_counts mc ON sv.make = mc.make
INNER JOIN max_sales ms ON mc.total_sales = ms.highest_count;

方案二:使用窗口函数快速筛选(推荐)

窗口函数可以一步到位完成排名和筛选,代码更简洁,而且灵活度高:

WITH ranked_records AS (
    SELECT 
        sv.make,
        c.first,
        c.MI,
        c.last,
        -- 按MAKE的总销售次数降序排名,相同次数的MAKE会获得相同排名
        RANK() OVER (ORDER BY COUNT(*) OVER (PARTITION BY sv.make) DESC) AS make_rank
    FROM Sales s
    INNER JOIN Sale_Vehicles sv ON s.VIN = sv.VIN
    INNER JOIN Customers c ON s.cust_ID = c.cust_ID
)
-- 只保留排名第一的记录(即最高频MAKE的所有客户信息)
SELECT make, first, MI, last
FROM ranked_records
WHERE make_rank = 1;

小提示:

  • 如果你只需要返回任意一个最高频的MAKE(即使有多个MAKE频次相同),可以把RANK()换成ROW_NUMBER(),它会给每条记录分配唯一排名。
  • 原语句的问题在于GROUP BY包含了客户信息,导致分组粒度太细,没办法直接统计整个MAKE的总频次。我们需要先把MAKE的频次统计出来,再做筛选关联。

内容的提问来源于stack exchange,提问作者beginnerDeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:39:23