SQL группа по наибольшему происхождению - PullRequest
0 голосов
/ 25 марта 2020

Выполнив этот запрос

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

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете использовать оконные функции:

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), другой параметр: </p>

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
)
0 голосов
/ 25 марта 2020

Использовать оконные функции:

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() возвращает все значения с наивысшим рейтингом. Используйте ROW_NUMBER(), если вам нужен только один ряд, даже если есть связи для первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...