一定义
普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值,而开窗函数则可为窗口中的每行都返回一个值。简单理解,就是对查询的结果多出一列,这一列可以是聚合值,也可以是排序值。在ISO SQL规定了这样的函数为开窗函数,在 Oracle中则被称为分析函数,而在DB2中则被称为OLAP函数。
(聚合函数是对一组值执行计算并返回单一的值的函数。)
二、与普通函数区别
a、SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。
b、聚合函数每组只返回一个值,开窗函数每组可返回多个值。
注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持
三、调用格式
函数名(列名) OVER(partition by 列名 order by列名)
OVER关键字表示把函数当成开窗函数而不是聚合函数。对于查询结果的每一行都返回所有符合条件的行的条数。OVER关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果OVER关键字后的括号中的选项为空,则开窗函数会对结果集中的所有行进行聚合运算
四、执行顺序
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行
五、分类
两类:一类是聚合开窗函数,一类是排序开窗函数
聚合开窗函数:有ORDER BY,不写后面的开窗语句(range/rows between … and …),默认为分组中的第一行到当前行。
没有ORDER BY,不写后面的开窗语句(range/rows between … and …),默认为分组中的所有行
排序开窗函数:first_value() 、last_value() 、lag() 、lead()使用方法:lag ,lead 分别是向前,向后;lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值





