emp_id | dep_name | salary |
---|---|---|
7 | develop | 4200 |
8 | develop | 6000 |
9 | develop | 4500 |
10 | develop | 5200 |
11 | develop | 5200 |
2 | personnel | 3900 |
5 | personnel | 3500 |
1 | sales | 5000 |
3 | sales | 4800 |
4 | sales | 4800 |
如果要将每位员工与其部门的平均工资进行对比, 需要这样的结果:
emp_id | dep_name | salary | avg |
---|---|---|---|
7 | develop | 4200 | 5020 |
8 | develop | 6000 | 5020 |
9 | develop | 4500 | 5020 |
10 | develop | 5200 | 5020 |
11 | develop | 5200 | 5020 |
2 | personnel | 3900 | 3700 |
5 | personnel | 3500 | 3700 |
1 | sales | 5000 | 4866.66666666667 |
3 | sales | 4800 | 4866.66666666667 |
4 | sales | 4800 | 4866.66666666667 |
如果不用窗口函数来查询, 则比较复杂, 当然也能做到, 语句如下:
SELECT e0.emp_no, e0.dep_name, e0.salary, e2.avg_salary FROM public.emp_salary e0 join ( select e1.dep_name, avg(e1.salary) as avg_salary from public.emp_salary e1 group by e1.dep_name ) e2 on e2.dep_name = e0.dep_name order by e0.dep_name, e0.emp_no;
如果使用窗口函数进行查询, 则很容易做到, sql 语句如下:
SELECT emp_no, dep_name, salary, avg(salary) over(partition by dep_name) FROM public.emp_salary order by dep_name, emp_no;
但是如果要查询随着员工的增加, 各部门平均工资的变化, 如下表所示的结果, 不用窗口函数查询的话就很难做到了。
emp_id | dep_name | salary | avg |
---|---|---|---|
7 | develop | 4200 | 4200 |
8 | develop | 6000 | 5100 |
9 | develop | 4500 | 4900 |
10 | develop | 5200 | 4975 |
11 | develop | 5200 | 5020 |
2 | personnel | 3900 | 3900 |
5 | personnel | 3500 | 3700 |
1 | sales | 5000 | 5000 |
3 | sales | 4800 | 4900 |
4 | sales | 4800 | 4866.66666666667 |
如果使用窗口函数, 依然可以轻松完成, 语句如下:
SELECT emp_no, dep_name, salary, avg(salary) over(partition by dep_name order by emp_no) FROM public.emp_salary order by dep_name, emp_no;
可见, 窗口函数在需要对查询结果中的相关行进行计算时有很大的优势。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。