如何编写一个 SQL 查询,其中包含每个部门按日期计算的最低和最高工资?

How to write a SQL query with minimum and maximum salary from each department by date?

我有一个 table 如下所示:

 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 查询来以这种方式获取输出?

一种方法使用 window 函数和条件聚合:

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;