Один метод использует оконные функции и условное агрегирование:
select year,
max(dept) filter (where seqnum_asc = 1) as min_salary_dept,
max(dept) filter (where seqnum_desc = 1) as max_salary_dept
from (select t.*,
row_number() over (partition by year order by salary) as seqnum_asc,
row_number() over (partition by year order by salary desc) as seqnum_desc
from t
) t
group by year;
Если вам не нужны подзапросы, вы можете использовать массивы:
select year,
(array_agg(dept order by salary asc))[1] as min_salary_dept,
(array_agg(dept order by salary desc))[1] as max_salary_dept
from t
group by year;