如何编写一个 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;
我有一个 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;