首页 > 解决方案 > 如何从“分组依据”方法中查找前 N 条记录,其中 N 条记录可以包含多个值?

问题描述

我正在练习W3 School SQL Tables。从Customers表中,我可以通过以下 SQL 选择每个国家/地区的客户数量

select country, count(*) as NumOfCustomer 
from Customers 
group by country
order by NumOfCustomer Desc;

这给了我这样的结果:

在此处输入图像描述

如果我想选择客户最多的前 5 个国家/地区,我无法使用Limit 5,因为Germany and France客户数量第二多,客户Mexico and Spain数量第五多。使用限制 5 将不包括Mexico and Spain

如何获得包含所有N最高值的结果,其中最高值可以N像以前一样重复第一个数字?

标签: mysqlsqlgroup-bysql-order-by

解决方案


你可以使用DENSE_RANK

返回当前行在其分区中的排名,没有间隙。同行被视为平局并获得相同的排名。此功能为对等组分配连续等级;结果是大小大于一个的组不会产生不连续的秩数

WITH cte AS (
  select country, count(*) as NumOfCustomer 
  from Customers 
  group by country
), cte2 AS (
  SELECT *, DENSE_RANK() OVER(ORDER BY NumOfCustomer DESC) AS rnk
  FROM cte
)
SELECT *
FROM cte2
WHERE rnk <= 5
ORDER BY NumOfCustomer DESC

推荐阅读