Как написать SQL-запрос с минимальной и максимальной зарплатой от каждого отдела по дате? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть таблица, как показано ниже:

 dept  | salary | year
 ------+--------+-----
 HR    | 1000   | 2014
 Acc   | 2000   | 2014
 Acc   | 1000   | 2015
 Acc   | 3000   | 2015
 Dev   | 5000   | 2015

Я хочу найти отдел с минимальной и максимальной зарплатой, сгруппированный по годам. Ожидаемый результат выглядит следующим образом:

year | min_sal_dept | max_sal_dept
-----+--------------+-----
2014     HR             Acc
2015     Acc            Dev

Как мне написать SQL-запрос для получения вывода таким способом?

1 Ответ

1 голос
/ 04 июня 2019

Один метод использует оконные функции и условное агрегирование:

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