一、开窗函数是什么
1、定义:
普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值,而开窗函数则可为窗口中的每行都返回一个值。简单理解,就是对查询的结果多出一列,这一列可以是聚合值,也可以是排序值。在ISO SQL规定了这样的函数为开窗函数,在 Oracle中则被称为分析函数,而在DB2中则被称为OLAP函数。
(聚合函数是对一组值执行计算并返回单一的值的函数。)
2、与普通函数区别:
a、SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。
b、聚合函数每组只返回一个值,开窗函数每组可返回多个值。
注:常见主流数据库目前都支持开窗函数,但mysql数据库目前还不支持。
3、调用格式:
函数名(列名) OVER(partition by 列名 order by列名)
OVER关键字表示把函数当成开窗函数而不是聚合函数。对于查询结果的每一行都返回所有符合条件的行的条数。OVER关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果OVER关键字后的括号中的选项为空,则开窗函数会对结果集中的所有行进行聚合运算。
unbounded:无界限
preceding:从分区第一行头开始,则为 unbounded。 N为:相对当前行向前的偏移量
following :与preceding相反,到该分区结束,则为 unbounded。N为:相对当前行向后的偏移量
current row:顾名思义,当前行,偏移量为0
例子:
partition by order by asc/desc rows/range between unbounded preceding and current row
partition by order by asc/desc rows/range between 1 preceding and 1 following
4、执行顺序:
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行
二、开窗函数分类
有两类:一类是聚合开窗函数,一类是排序开窗函数。
1、聚合函数:
count() over(partition by ... order by ..