序言
其实也很少使用这个Over函数,毕竟mysql在5.7版本之前都是不支持的,但是over()的窗口概念被Flink中的窗口中借鉴了. 所以了解下,网上的Over()的使用有在Mysql中的例子,但是我的Mysql5.7 不支持,所以在Oracle中实验.但是语法都是一样的.cuiyaonan2000@163.com
众所周知如果SQL有了GROUP By 则结果必须是聚合函数计算的返回值,或者说如果没有GroupBy 则不能使用聚合函数返回字段的统计信息,Over()就是为了解决这个问题出现的,让我们可以将聚合函数跟普通的字段同时返回cuiyaonna2000@163.com
Begin
基于如下的表结构来做实验
例子1
如下所示,红框的Sql语句就会报错显示不是聚合函数,但是使用了over()的就可以显示出最高的工资.
如上是最简单的用法直接使用over() 获取满足条件的所有记录列的统计信息.如下所示
例子2
OVER(PARTITION BY yyy1,yyy2,yyy3)
跟groupby 可以有多个一样,就是当yyy1 一样后 在按照yyy2进行分组 示例如下所示
仅仅按照gop分组
gop一样在按照id再次分组
例子3
OVER(ORDER BY yyy1,yyy2,yyy3 ASC\DESC)
通过如下例子,我们看到,over(orcer by) 是返回的当前出现的最大值. 比如第一个例子是升序,第一条记录最大值是1,当第二条记录出现最大值变成了2 ,依次类推,返回的值都是当前记录行的已经出现的最大值cuiyaonan2000@163.com .而当从大到小排列的时候 JJJ的最大值就是5,后面的记录行的值都比它小所以不会再次变更了.
升序排列 jjj的值就是从当前出现记录行的最大值.(如下的order by 相当于在 from后面加上了 order by 进行排序.)
降序排列 jjj的值就是最大值,.(如下的order by 相当于在 from后面加上了 order by 进行排序.)
例子4
partition 与order 集合,如果单纯的只有 order by 则是全局排序,跟partition则是组内排序
同时注意order by 出现后 排序顺序的结果差异,所以不建议使用order by
通过如下例子,我们看到,over(orcer by) 是返回的当前出现的最大值. 比如第一个例子是升序,第一条记录最大值是1,当第二条记录出现最大值变成了2 ,依次类推,返回的值都是当前记录行的已经出现的最大值cuiyaonan2000@163.com .而当从大到小排列的时候 JJJ的最大值就是5,后面的记录行的值都比它小所以不会再次变更了.
Over() 可用的其它函数
- SUM()
- AVG()
- COUNT()
- MAX()
- MIN()
AVG()\COUNT()\MAX()\MIN()的括号中必须要有参数,用于统计某一列的对应的值,并且这一列中如果含有值为NULL的行,那么就会忽略值NULL的行
COUNT()则比较特殊,如果是COUNT(*),那么就不会忽略NULL值的行,用来统计这个表中有多少行
COUNT(column),统计某一列column有多少行,那么就会忽略NULL的行。