如何编写每个日期按部门的最低和最高薪水的SQL查询?

时间:2019-06-04 10:36:29

标签: sql postgresql postgresql-9.3

我有一个如下表:

 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 个答案:

答案 0 :(得分:1)

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

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;