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
聚合通过对 Name
和 Country
进行分组来获得每个计数。
然后使用 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
对于每个组,我想获取包含最受欢迎列的行。
这是一个例子, 我有 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
聚合通过对 Name
和 Country
进行分组来获得每个计数。
然后使用 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