[英]Select all rows with top N most frequent columns for each Group
對於每個組,我想獲取包含最受歡迎列的行。
這是一個示例,我有一張包含國家、state 和姓名的表格。
對於每個國家/地區,我將 select 具有前 2 個最流行名稱的行。 在美國,最受歡迎的兩個名字是 John 和 Joe; 對於加拿大,他們是 Will 和 Rafe。
這是文本格式的輸入表。
國家 | State | 名稱 |
---|---|---|
美國 | 加州 | 約翰 |
美國 | 西澳大利亞州 | 傑克 |
美國 | 加州 | 喬 |
美國 | CT | 喬 |
美國 | 錳 | 約翰 |
加拿大 | AB | 喬 |
加拿大 | AB | 雷夫 |
加拿大 | AB | 將要 |
加拿大 | 公元前 | 將要 |
加拿大 | 公元前 | 雷夫 |
還有 output 表。
國家 | State | 名稱 |
---|---|---|
美國 | 加州 | 約翰 |
美國 | 加州 | 喬 |
美國 | CT | 喬 |
美國 | 錳 | 約翰 |
加拿大 | AB | 雷夫 |
加拿大 | AB | 將要 |
加拿大 | 公元前 | 將要 |
加拿大 | 公元前 | 雷夫 |
如果您的 mysql 版本支持 window function,我們可以使用COUNT
聚合通過分組Name
和Country
來計算每個。
然后使用帶有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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.