热线电话:13121318867

登录
2020-06-03 阅读量: 1227
mysql开窗函数

开窗函数:

它可以理解为记录集合,开窗函数也就是在满足某种条件的记录集合上执行的特殊函数。

对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口

有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口

开窗函数的本质还是聚合运算,只不过它更具灵活性,它对数据的每一行,都使用与该行相关的行进行计算并返回计算结果。

开窗函数和普通聚合函数的区别

  • 聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条。
  • 聚合函数也可以用于开窗函数中。

按照函数功能不同,MySQL支持的开窗函数分为如下几类:

序号函数:row_number() / rank() / dense_rank()

分布函数:percent_rank() / cume_dist()

前后函数:lag() / lead()

头尾函数:first_value() / last_value()

其他函数:nth_value() / nfile()

开窗函数的一个概念是当前行,当前行属于某个窗口,窗口由

over关键字用来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,开窗函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口:

partition by子句:按照指定字段进行分区,两个分区由边界分隔,开窗函数在不同的分区内分别执行,在跨越分区边界时重新初始化。

order by子句:按照指定字段进行排序,开窗函数将按照排序后的记录顺序进行编号。可以和partition by子句配合使用,也可以单独使用。

frame子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。

current row 边界是当前行,一般和其他范围关键字一起使用

unbounded preceding 边界是分区中的第一行

unbounded following 边界是分区中的最后一行

expr preceding 边界是当前行减去expr的值

expr following 边界是当前行加上expr的值

rows between 1 preceding and 1 following 窗口范围是分区中的当前行、前一行、后一行一共三行记录。

rows between 1 preceding and current row 窗口范围是分区中的前一行、当前行一共两行记录。

rows between current row and 1 following 窗口范围是分区中的当前行、后一行一共两行记录。

rows unbounded preceding 窗口范围是分区中的第一行到当前行。

rows between unbounded preceding and current row 窗口范围是分区中的第一行到当前行。

rows between current row and unbounded following 窗口范围是分区中的当前行到最后一行。

rows between unbounded preceding and unbounded following 窗口范围是当前分区中所有行,等同于不写。

————————————————

版权声明:本文为CSDN博主「阿柯@CDA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/kejiayuan0806/java/article/details/103297893

18.1882
1
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子