窗口函数是类似于可以返回聚合函数值的函数,例如SUM(),COUNT(),MAX()。但是窗口函数又与普通的聚合函数不一样,它不会对结果进行分组,使输出中的行数和输入中的行数相同。
窗口函数示例:
讯享网
这里有3点需要注意:
- 聚合功能:在上述例子中,我们使用了sum(),这里也可以使用count()、avg()等之类的计算功能
- partition by:功能与group by子句类似,但是在窗口函数中要使用partition by
- order by:order by与普通查询语句中的order by语句没什么不同,要注意使用的顺序
基本语法:
讯享网
- over():开窗函数,用于框选函数,如果没有任何参数,代表针对from后面的数据表中所有记录
- partition by:分组操作,主要是针对over开窗函数中的数据进行分组
- order by:如果有分组,只想针对组内的数据进行排序
若是想求解以性别分组,求解各个分组中的平均函数:

- 不能返回原数据表中的字段值
使用窗口函数可以在返回各个分组的聚合函数的同时返回原数据表中的各个数据值
讯享网

使用聚合函数 + join可以达到相同的效果:

- 简单
窗口函数更易于使用。在上面示例中,与使用聚合函数然后合并效果对比,使用窗口函数使用更少sql语句就可以获取想要的结果
- 快速
这一点与上一点相关,使用窗口函数比使用替代方法要快的多。当你处理成千上万个千兆字节的数据时,这非常有用。
- 多功能性
最重要的是,窗口函数具有多种功能,比如,添加移动平均线,添加行号,组内排序等。
优先级递减:
from 、 where 、 group by 、聚合函数、having、窗口函数、select、distinct、union、order by、offset、limit
各表的关系:

- 三张表通过部门id关联起来
部门表:

员工表:

采购表:
窗口函数是对表中一组数据进行计算的函数,一组数据与当前行有关。
例如:计算每三天的销售总金额,就可以使用窗口函数,以当前行为基准,选前一行,后一行,三行一组如下图所示:

之所以称之为窗口函数,是因为好像有个固定大小的窗框划过数据集,滑动一次取一次,对窗口内的函数进行处理。
基本语法:
讯享网
- <window_function>: 这里可以是我们之前已经学过的聚合函数,比如(, , 等)。也可以是其他函数,比如ranking 排序函数,分析函数等
- OVER(...):窗口函数的窗框子句定义,窗口函数中很重要的一部分就是通过定义窗框的开窗方式和大小)
如果over子句中为空则代表对全部数据进行计算,然后再加上使用的聚合函数或其他函数
查询员工表中,员工姓名、员工工资以及所有员工的平均薪资:


显示每个人的姓名,薪资以及公司的每个月工资支出情况:
讯享网
统计采购表中的平均采购价格,并与明细一起显示(每件物品名称,价格):

对于over()的计算结果进一操作
例如:计算每一位员工与平均薪资的差距
讯享网


采购价格占比总采购的百分比:

在一条SQL语句中可以使用多个窗口函数
在purchase表基础上,添加平均价格和采购总金额两列
讯享网

- 可以使用<window_function> OVER() ,对全部查询结果进行聚合计算
- 窗口函数在聚合计算的同时还可以保留每行的其他数据的原始信息
- 在where条件执行之后,才会执行窗口函数,所以不能在where子句中使用窗口函数
- 可以在一条sql语句中同时创建多个窗口函数
通过窗口函数实现排序函数,基本语法如下:

游戏表(game):

游戏采购表(game_purchase):

使用方法:
讯享网
- 会返回每一行的等级(序号)
- 对行进行排序将数据进行升序或降序排列
- 是一个函数,与配合返回序号
注意:rank() 有并列不连续
案例1:根据游戏的评分进行排名,要求有并列且排名序号不连续

案例2:统计每个游戏的名字,分类,更新日期,更新日期序号
讯享网

rank()函数返回的序列,可能会出现不连续的情况。
如果想在有并列情况发生下仍然返回连续序号,可以使用dense_rank()函数
注意:返回的序号有并列且连续
案例3:根据游戏的评分进行排名,要求有并列且排名序号连续

想要获取排序之后的序号,也可以使用row_number()来实现,通过名字就可以知道,意思是返回行号。
连续的且没有并列
讯享网

通过对游戏评分的对比:

- rank() 函数返回的是一个有并列,不连续的序号
- dense_rank() 函数返回的是一个有并列,连续的序号
- row_number() 函数返回的是一个不连续且没有并列的行号

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/137264.html