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就需要注意加followingcurrent row:表示当前行,如果出现这个那么也就是范围指定到后面了,注意row不要忘记了