SQL 按出现次数最高的分组
SQL group by highest occurance
通过执行这个查询
SELECT year, genre, COUNT(genre)
FROM Oscar
GROUP BY year, genre
我得到以下输出:
2016 Action 2
2016 Romance 1
2017 Action 1
2017 Romance 2
2018 Fantasy 1
2019 Action 1
2019 Fantasy 2
2020 Action 3
2020 Fantasy 1
2020 Romance 1
现在我只想显示每年显示数量最多的流派。最好的方法是什么?
所以我希望输出看起来像这样:
2016 Action
2017 Romance
2018 Fantasy
2019 Fantasy
2020 Action
使用window函数:
SELECT year, genre
FROM (SELECT year, genre, COUNT(*) as cnt,
RANK() OVER (PARTITION BY year ORDER BY COUNT(*) DESC) as seqnum
FROM Oscar
GROUP BY year, genre
) yg
WHERE seqnum = 1;
如果有平局,RANK()
returns 所有排名最高的值。如果您特别想要一行,请使用 ROW_NUMBER()
,即使第一行并列也是如此。
您可以使用 window 函数:
SELECT year, genre
FROM (
SELECT year, genre, RANK() OVER(PARTITION BY year ORDER BY COUNT(*) DESC) rn
FROM Oscar
GROUP BY year, genre
) t
WHERE rn = 1
如果您的数据库不支持 window 函数(例如 MySQL < 8.0),另一种选择是:
SELECT year, genre
FROM Oscar o
GROUP BY year, genre
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM Oscar o1
WHERE o1.year = o.year
GROUP BY o1.category
ORDER BY COUNT(*) DESC LIMIT 1
)
通过执行这个查询
SELECT year, genre, COUNT(genre)
FROM Oscar
GROUP BY year, genre
我得到以下输出:
2016 Action 2
2016 Romance 1
2017 Action 1
2017 Romance 2
2018 Fantasy 1
2019 Action 1
2019 Fantasy 2
2020 Action 3
2020 Fantasy 1
2020 Romance 1
现在我只想显示每年显示数量最多的流派。最好的方法是什么?
所以我希望输出看起来像这样:
2016 Action
2017 Romance
2018 Fantasy
2019 Fantasy
2020 Action
使用window函数:
SELECT year, genre
FROM (SELECT year, genre, COUNT(*) as cnt,
RANK() OVER (PARTITION BY year ORDER BY COUNT(*) DESC) as seqnum
FROM Oscar
GROUP BY year, genre
) yg
WHERE seqnum = 1;
如果有平局,RANK()
returns 所有排名最高的值。如果您特别想要一行,请使用 ROW_NUMBER()
,即使第一行并列也是如此。
您可以使用 window 函数:
SELECT year, genre
FROM (
SELECT year, genre, RANK() OVER(PARTITION BY year ORDER BY COUNT(*) DESC) rn
FROM Oscar
GROUP BY year, genre
) t
WHERE rn = 1
如果您的数据库不支持 window 函数(例如 MySQL < 8.0),另一种选择是:
SELECT year, genre
FROM Oscar o
GROUP BY year, genre
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM Oscar o1
WHERE o1.year = o.year
GROUP BY o1.category
ORDER BY COUNT(*) DESC LIMIT 1
)