我有一个如下表:
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查询以这种方式获取输出?
答案 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;