示例1:
select depname, empno, salary, avg(salary) over (partition by depname) from empsalary;
第四列表示对与当前行具有相同depname值的所有表行取得平均值。
一个窗口函数调用总是包含一个直接跟在窗口函数名及其参数之后的OVER子句。这使得它从句法上和一个普通函数或非窗口函数区分开来。OVER子句决定究竟查询中的哪些行被分离出
来由窗口函数处理。OVER子句中的PARTITION BY子句指定了将具有相同PARTITION BY表达式
值的行分到组或者分区。对于每一行,窗口函数都会在当前行同一分区的行上进行计算。
示例2:
select depname, empno, salary,rank() over (partition by depname order by salary desc) from empsalary;
rank函数在当前行的分区内按照ORDER BY子句的顺序为每一个可区分的ORDER BY值产生了一个数字等级。rank不需要显式的参数,因为它的行为完全决定于OVER子句。
一个窗口函数所考虑的行属于那些通过查询的FROM子句产生并通过WHERE、GROUP BY、HAVING过滤的“虚拟表”。
窗口函数只允许出现在查询的select列表和order by子句中,不允许出现在其他地方。
窗口帧:对于每一行,在它的分区中的行集被称为它的窗口帧。
一些窗口函数只作用在窗口帧中的行上,而不是整个分区。默认情况下,如果使用ORDER BY,则帧包括从分区开始到当前行的所有行,以及后续任何与当前行在ORDER BY子句上相等的行。如果ORDER BY被忽略,则默认帧包含整个分区中所有的行。
select salary, sum(salary) over () from empsalary; 窗口帧就是整个分区
select salary, sum(salary) over (order by salary) from empsalary;
这里的合计是从第一个(最低的)薪水一直到当前行,包括任何与当前行相同的行(注意相
同薪水行的结果)。