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
相关产品推荐
相关产品推荐

