SQL tricks
September 1

Как вывести наиболее повторяющееся значение в таблице при группировке?

Дано: Две таблицы: пользователи (users) и их увлечения (user_hobbies)

Таблица: users

 id age name   
 1  18  Иван 
 2  18  Михаил 
 3  20  Светлана 
 4  18  Елена

Таблица: user_hobbies

user_id hobby
1       футбол
2       футбол
3       чтение
4       путешествия

Вопрос: Как получить наиболее популярное хобби для каждого возраста?

 -- подсчитаем популярность каждого хобби в зависимости от возраста
  select 
    age, hobby, count(*) popularity
  from user_hobbies
  join users on user_hobbies.user_id = users.id
  group by age, hobby;
  Результат:
  +=====+=============+============+
  | age | hobby       | popularity |
  +=====+=============+============+
  | 18  | путешествия | 1          |
  +-----+-------------+------------+
  | 18  | футбол      | 2          |
  +-----+-------------+------------+
  | 20  | чтение      | 1          |
  +-----+-------------+------------+
  -- из полученного запроса выберем самые популярные хобби для каждого возраста
  select distinct
    age, 
    first_value(hobby) over (partition by age order by popularity desc) AS hobby
  from (
    select 
	  age, hobby, count(*) popularity
    from user_hobbies
    join users on user_hobbies.user_id = users.id
    group by age, hobby
  ) hobbies;
  Результат:
  +=====+========+
  | age | hobby  |
  +=====+========+
  | 18  | футбол |
  +-----+--------+
  | 20  | чтение |
  +-----+--------+

Воспользуйтесь ссылкой для тестирования:

https://sqlize.online/sql/mysql80/2cac27a36a34a12a5dc7c737fbe5209a/