如何通过“分组依据”方法查找前N条记录,其中N条记录可以包含多个值?

时间:2019-01-12 17:57:17

标签: mysql sql group-by sql-order-by

我正在与W3 School SQL Tables一起练习。在Customers表中,我可以按照SQL选择每个国家/地区的客户数量

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

这给了我这样的结果:

enter image description here

如果我要选择客户数量最多的前5个国家/地区,则不能使用Limit 5,因为Germany and France的客户数量第二高,Mexico and Spain的客户数量第五高。使用限制5不包含Mexico and Spain

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

1 个答案:

答案 0 :(得分:1)

您可以使用DENSE_RANK

  

返回当前行在其分区内的位置,没有空格。 对等体被视为纽带,并获得相同的排名。此功能将连续的排名分配给对等体组;结果是,大小大于1的组不会产生不连续的等级编号

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