MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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不要忘记了
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql