#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
.