MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())
和传统的聚合函数区别?
最大的区别在于,一个操作列,一个是依次操作行,最终显示出每一行,最后的效果就是呈现叠加的效果

-- 开窗聚合函数
SELECT
dname,
ename,
salary,
sum( salary ) over ( PARTITION BY dname ORDER BY hiredate ) AS c1
FROM
employee

根据上面的结果,可以明显的看出,sum()操作是对每一行进行迭代,迭代之前的总数
1、如果没有order by 操作就会对所有的数据进行聚合操作

也可以控制行数,开头和结尾
rows between unbounded(开头) preceding and current(当前行) row
2、从当前行向上取出三个值,相加然后和当前行相加,就得到了当前行的最终值,如果是没有的话,那么就取到有的值。
SELECT
dname,
ename,
salary,
sum( salary ) over ( PARTITION BY dname ORDER BY hiredate rows between 3 preceding and current row) AS c1
FROM
employee

3、 这里就是取出前面三行和后面一行,再去和本身相加,最终得到最终值
select
dname,
ename,
salary,
sum(salary) over(partition by dname order by hiredate rows between 3 preceding and 1 following) as c1
from employee;

4、 从当前行加到最后
SELECT
dname,
ename,
salary,
sum( salary ) over ( PARTITION BY dname ORDER BY hiredate rows BETWEEN current ROW AND unbounded following ) AS c1
FROM
employee;

可以将sum换成avg或者max等聚合函数,最终的原理都是一样的
语法结构:rows between unbounded(开头) preceding and current(当前行) row
紧跟到order by 后面。
按照这样的形式我们可以最终获取
rows是不需要变动的参数,between 也是不需要变动的参数
unbounded preceding :开头
number preceding :加上具体的数字就是往上取到多少值
注意:如果是数值的话,或者开头一定要跟上preceding这个参数
current row:表示当前行,如果出现这个那么也就是范围指定到后面了
其次不变的就是and
如果and后面跟上具体的数字,那么就是代表着向后取多少行
unbounded following:取到最后一行
number following:向后取到具体的行
注意:如果是数值和unbounded就需要注意加following
current row:表示当前行,如果出现这个那么也就是范围指定到后面了,注意row不要忘记了