该函数只有MySQL8.0版本才存在
MySQL 8.0 关于开窗函数的官方文档[这里是图片001]https://dev.mysql.com/doc/refman/8.0/en/window-functions.html
当在业务中,既要显示 聚合前的数据 又要显示 **聚合后的数据,**这时我们可以使用开窗函数来实现。
**具体实例:**下表是关于一年中每个月每个员工的工资记录表(Payroll_records),现有需求是在保留原表数据基础上,增加一列累计工资(salary_accumulation)累计的计算一年的工资。
原表 Payroll_records

目标表

**窗口函数:**窗口 + 函数
我们以每个服务器每天的累计启动次数为例来介绍该函数,sql表如下:

聚合函数使用——SUM
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as cnt_all
from linux;

聚合函数使用——SUM
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
sum(cnt) over (partition by name order by dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as sum_all1,
sum(cnt) over (partition by name order by dt ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ) as sum_all2,
sum(cnt) over (partition by name order by dt ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING ) as sum_all3,
sum(cnt) over (partition by name order by dt ROWS BETWEEN 3 PRECEDING AND UNBOUNDED FOLLOWING) as sum_all4,
sum(cnt) over (partition by name order by dt ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) as sum_all5
from linux;

内置窗口函数——NTITLE 分组或者分类(个人理解)
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
ntile(2) over (partition by name order by dt ) as n2,
ntile(3) over (partition by name order by dt ) as n3
from linux;

内置窗口函数——RANK、ROW_NUMBER、DENSE_RANK 编号
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
RANK() over (partition by name order by cnt desc ) as rk,
ROW_NUMBER() over (partition by name order by cnt desc) as rw,
DENSE_RANK() over (partition by name order by cnt desc ) as d_rk
from linux;

注意:这三种内置函数只是赋予编号并不是直接能够排列,需要over()中的order by,当删除上述代码中的desc时,编号就会变为降序,注意下面的rk:
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
RANK() over (partition by name order by cnt ) as rk,
ROW_NUMBER() over (partition by name order by cnt desc) as rw,
DENSE_RANK() over (partition by name order by cnt desc ) as d_rk
from linux;

内置窗口函数——LEAD、LAG 取值之串行
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
LEAD(dt, 1, “9999-99-99”) over (partition by name order by dt ) as lead_alias,
LAG(dt, 1, “9999-99-99”) over (partition by name order by dt ) as lag_alias
from linux;

内置窗口函数——FIRST_VALUE、LAST_VALUE取值之窗口首尾值
select name,
dt,
cnt,
sum(cnt) over (partition by name order by dt ) as sum_all,
FIRST_VALUE(cnt) over (partition by name order by dt ) as fv,
LAST_VALUE(cnt) over (partition by name order by dt ) as lv
from linux;

SQL文件在这里,可以自己下载试一下[这里是图片012]https://download.csdn.net/download/Mr__Sun__/85172998