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
)