按最高发生率划分的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
)