按最高发生率划分的SQL组

按最高发生率划分的SQL组,sql,group-by,count,greatest-n-per-group,window-functions,Sql,Group By,Count,Greatest N Per Group,Window Functions,通过执行此查询 SELECT year, genre, COUNT(genre) FROM Oscar GROUP BY year, genre 我得到了以下输出: 2016 Action 2 2016 Romance 1 2017 Action 1 2017 Romance 2 2018 Fantas

通过执行此查询

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
使用窗口功能:

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;
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

如果存在联系,则RANK返回所有排名最高的值。如果您特别想要一行,请使用行号,即使第一行有领带。

您可以使用窗口功能:

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;
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
如果您的数据库不支持窗口函数,例如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
)