窗口函数(开窗函数)及OVER子句(1):基础

窗口函数(开窗函数)及OVER子句(1):基础

若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

一、窗口的概念
1、窗口(window)是标准SQL中的术语,可理解为是运算将要操作的行的集合,窗口与分组或分区是类似的,都是对表中的行进行的一种划分方法,分组由GROUP BY子句划分,而窗口是用OVER子句划分的,分组和窗口还有很多不同的地方,后文会作详细介绍。需要注意的是,窗口的最终结果是一个集合,在SQL Server具体实现时,窗口是在基础查询的结果集上进行定义的,因此,窗口是基础查询结果集的一个子集。
2、窗口函数:使用OVER子句定义的窗口进行计算的函数,被称为窗口函数或开窗函数。这意味着,窗口函数的计算范围(或作用范围、作用域)是OVER子句定义的数据行集合(即窗口),SQL Server支持的窗口函数类型有:聚合函数、排序函数、分析函数和偏移函数、NEXT VALUE FOR 函数。

二、OVER子句定义窗口(即分区)的方法
1、以集合的思维思考问题
关系模型基于集合理论,因此,我们应以集合的思维来思考问题,而不是以常规的迭代思维来思考问题,集合中的元素是没有顺序的,这一点与迭代思维有很大的不同。使用迭代思维提取表中的行时,是按照一定的顺序以迭代的方式逐行提取的,但对于关系模型而言,一张表是一个集合,表中的行没有顺序,在SQL Server中,唯一确保表中的行按特定顺序输出(或展示)的方法就是在查询中使用ORDER BY子句。
2、注意:实际物理实现时,并不一定会以集合的方式来实现,但在语言层面(即T-SQL语言)和逻辑层面,应以集合的方式(没有顺序)来思考问题,而不是以迭代方式(以一定顺序,每次一条)来思考问题,语言或逻辑层面与数据库引擎的物理实现是没有关系的,物理层的责任是正确地以尽可能快的方法来实现逻辑层的要求,因此,不同的数据库引擎可使用不同的方法来实现逻辑层的要求。
3、OVER子句定义窗口的原理及其语法元素
1)、OVER子句由3个核心元素组成,即分区、排序和框架,但不是所有窗口函数都支持这3 个元素。OVER子句语法的一般形式如下(各元素的具体语法,详见后文)
OVER ( [ PARTITION BY clause ] --分区元素
[ ORDER BY clause ] --排序元素
[ ROW or RANGE clause ] ) --框架元素
为讲解需要,此处先对PARTITION BY子句过滤的原理作一讲解,其余元素的具体讲解,详见后文。PARTITION BY子句用于对查询结果集进行分区,其原理为,只有在结果集的分区列中与当前行的分区列有相同值的行才进入窗口,其余行被过滤掉
2)、OVER使用分区、排序和框架3个元素对窗口进行限制或过滤,如果OVER未对定义的窗口作限制(即OVER() ),则窗口包含查询结果集中从头开始的所有行
3)、OVER是对查询结果集的一种限制或者过滤而不是分组。OVER子句使用分区、排序和框架元素对窗口进行限制或过滤,符合要求的行才能进入窗口,不符合要求的行会被过滤掉。
4)、对于查询结果集中的每一行,OVER子句都会定义一个针对于该行的独立窗口,也就是说,若查询结果集有10行,就会为这10行单独定义10个独立的窗口,理解这一点相当重要。
5)、窗口函数的窗口是在查询结果集的基础上定义的,而基础查询的结果集需要在SELECT阶段才会产生,即在FROM、WHERE、GROUP BY,以及HAVING阶段之后才产生,这意味着,
 窗口是在对表进行了表操作符(如联接)、筛选(比如WHERE子句)、分组之后的结果集基础之上定义的。
 窗口函数只能用于SELECT和ORDER BY子句中,因此,窗口函数的逻辑处理顺序位于ORDER BY阶段或者SELECT的选择列表阶段(DISTINCT阶段之前,这对排序函数有影响,详见后文)。注意:修改语句中(比如UPDATE)不能出现窗口函数,因为修改语句不支持SELECT和ORDER BY子句。
4、本小节至第5小节,将以窗口聚合函数为基础进行讲解,因此,本章不会单独再对窗口聚合函数进行讲解,下面为窗口聚合函数的一些特点
 窗口聚合函数和分组聚合函数的功能是相同的,不同的是分组聚合函数的计算是通过分组查询进行的,窗口聚合函数的计算是通过OVER子句定义的窗口进行的,也就是说,分组聚合函数的计算范围是分组,而窗口函数的计算范围是窗口。
 窗口聚合函数只需在分组聚合函数的后面加上OVER子句即可,比如SUM (…) OVER (…)即为窗口聚合函数
 在SQL Server2012之后的窗口聚合函数才支持排序和框架子句。
 OVER 子句不能与 CHECKSUM 聚合函数结合使用

示例5.1:OVER子句定义窗口的原理(运行结果见图5.2)
select a,b,c,d,sum( c ) OVER(partition by a) from T4

在这里插入图片描述
对示例的说明
1)、对于行(1, 2, 3, 4),PARTITION BY a表示当前行的分区列和查询结果集的分区列为a,当前行列a的值为1,查询结果集是表T4的所有行,因此,当前行(1, 2, 3, 4)的窗口就是在查询结果集中列a的值为1的行,其窗口为行(1, 2, 3, 4),对该窗口的c列进行求和,其结果为3
2)、行(5, 6, 2, 1)的窗口是查询结果集中列a的值为5的行,其窗口为行(5, 6, 2, 1)和(5, 6, 11, 12),对该窗口的c列进行求和,其结果为2 + 11=13
3)、行(5, 6, 11, 12)的窗口是(5, 6, 2, 1)和(5, 6, 11, 12),对该窗口的c列进行求和,其结果为2 + 11=13
4)、行(4, 10, 1, 8)的窗口是(4, 10, 1, 8),对该窗口的c列进行求和,其结果为1

作者:黄邦勇帅(原名:黄勇)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/92027834
今日推荐