如何按行查找最大值的并列记录?附示例场景说明
如何找出各分组中与最大值并列的记录
这个需求我之前做销售数据分析时刚好碰到过——不仅要拿到每个地区的最高销售额,还要把所有并列第一的品牌都找出来对吧?我给你分享两种实用的SQL实现方式,都能精准得到你要的结果:
方法一:使用窗口函数(推荐,简洁高效)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle这些),用DENSE_RANK()或者RANK()是最方便的。DENSE_RANK()会给相同最大值的记录分配相同的排名,而且不会跳过排名数字,完美适配并列场景。
假设你的表结构是这样的:
CREATE TABLE sales ( region VARCHAR(50), brand VARCHAR(50), sales_amount INT );
对应的查询SQL:
SELECT region, brand, sales_amount FROM ( SELECT region, brand, sales_amount, DENSE_RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS rank_num FROM sales ) ranked_sales WHERE rank_num = 1;
执行这个查询后,就能直接得到每个地区里销售额最高的所有品牌——比如miami地区的honda和ford,san francisco地区的toyota和chevy都会被筛选出来。
方法二:子查询+关联查询(兼容性更强)
如果你的数据库版本比较老,不支持窗口函数,那就用子查询先拿到每个地区的最大值,再和原表关联匹配:
SELECT s.region, s.brand, s.sales_amount FROM sales s JOIN ( SELECT region, MAX(sales_amount) AS max_sales FROM sales GROUP BY region ) max_sales_per_region ON s.region = max_sales_per_region.region AND s.sales_amount = max_sales_per_region.max_sales;
这个逻辑也很直观:先通过分组聚合得到每个地区的最高销售额,再把原表中销售额等于对应地区最大值的记录全部捞出来,同样能得到所有并列第一的品牌。
两种方法都能满足你的需求,窗口函数写法更简洁,子查询则适配更多老版本数据库,你可以根据自己的环境选~
内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf
相关产品推荐
相关产品推荐

