06 /数据分析与SQL/ Lesson6 (选修) SQL 窗口函数
文章目录
2.视频:窗口函数 1
详细可以参考,介绍的很详细:/PostgreSQL’s 文档/
窗口函数有些像聚合函数,区别是窗口函数不会像聚合那样把每一类做一行输出,而依然是每行输出,这就能在一个表格中提供更多的数据,比如说下面这个官网的数据(注意OVER是窗口函数的标志):
直接使用窗口函数:
可以看到只是增加了一列,这列是所有salary的sum,对比salary和sum,可以看到每个员工的工资和总工资支出的对比。
SELECT salary, sum(salary) OVER () FROM empsalary;
salary | sum
--------+-------
5200 | 47100
5000 | 47100
3500 | 47100
4800 | 47100
3900 | 47100
4200 | 47100
4500 | 47100
4800 | 47100
6000 | 47100
5200 | 47100
(10 rows)
增加Orderby:
增加了orderby,就相当于把orderby内的salary排序,并且逐渐加和。这种方式在计算现金流的时候就很有用,可以看按照时间顺序,每笔损益给现金流带来的影响。
SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary;
salary | sum
--------+-------
3500 | 3500
3900 | 7400
4200 | 11600
4500 | 16100
4800 | 25700
4800 | 25700
5000 | 30700
5200 | 41100
5200 | 41100
6000 | 47100
(10 rows)
增加partition by
如果在over中增加partition by,则可以进一步拆分为小组,比如官网的这个例子,可以看出develop部门的ave工资是5020,personnel的平均工资是3700等等,这样在比较时就有了更详细的资料。
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
depname | empno | salary | avg
-----------+-------+--------+-----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
develop | 9 | 4500 | 5020.0000000000000000
develop | 8 | 6000 | 5020.0000000000000000
develop | 10 | 5200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales |