PostgreSQL — максимальное (count ()) объединение с группой по

#sql #postgresql #aggregation

#sql #postgresql #агрегирование

Вопрос:

У меня есть таблица, которая содержит уникальные транзакции вместе с годом транзакции и сотрудником, который ее выполнил. Мне нужно найти сотрудника с большинством транзакций за каждый год.

Мне нужна таблица с каждым годом, сотрудником с большинством транзакций в этом году и количеством транзакций, которые они провели в этом году. Это настолько близко, насколько я могу получить, не вызывая ошибки. Я не могу выбрать сотрудника без ошибки агрегирования.

 select year, max(num_trans)
from (select year, employee, count(trans_id) as num_trans
      from transactions
      group by year, employee) as x
group by year
  

Мне любопытно, как обойти это.

Ответ №1:

Используйте distinct on :

 select distinct on (year) year, employee, count(*) as num_trans
from transactions
group by year, employee
order by year, count(*) desc; 
  

distinct on это удобное расширение Postgres для стандартного SQL, которое сохраняет первую строку в группе строк. Группы определяются distinct on ключом (ключами). Какая строка является первой, определяется order by .