Select 每个组的前 N ​​个最常见列的所有行

Select all rows with top N most frequent columns for each Group

对于每个组,我想获取包含最受欢迎列的行。

这是一个例子, 我有 table 国家、州和姓名。

对于每个国家/地区,我将 select 具有前 2 个最流行名称的行。 在美国,最受欢迎的两个名字是 John 和 Joe;对于加拿大,他们是 Will 和 Rafe。

这里是文本格式的输入table。

Country State Name
USA CA John
USA WA Jack
USA CA Joe
USA CT Joe
USA MN John
Canada AB Joe
Canada AB Rafe
Canada AB Will
Canada BC Will
Canada BC Rafe

此外,输出 table.

Country State Name
USA CA John
USA CA Joe
USA CT Joe
USA MN John
Canada AB Rafe
Canada AB Will
Canada BC Will
Canada BC Rafe

如果您的 mysql 版本支持 window 功能,我们可以使用 COUNT 聚合通过对 NameCountry 进行分组来获得每个计数。

然后使用 self-join 和 ROW_NUMBER 来查找每个国家名称中最流行的前 2 个名称。

SELECT t2.*
FROM (
  SELECT *,ROW_NUMBER() OVER(PARTITION BY Country ORDER BY cnt desc) rn 
  FROM (
    SELECT Name,Country,COUNT(*)  cnt
    FROM T
    GROUP BY Name,Country
  ) t1
) t1
INNER JOIN T t2
ON t1.Country = t2.Country AND t1.Name = t2.Name
WHERE rn <= 2

sqlfiddle