内容发布更新时间 : 2024/12/28 12:34:42星期一 下面是文章的全部内容请认真阅读。
SQL Server中的窗口函数
简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念。 什么是窗口函数 窗口函数,也可以被称为OLAP函数或分析函数。理解窗口函数可以从理解聚合函数开始,我们知道聚合函数的概念,就是将某列多行中的值按照聚合规则合并为一行,比如说
Sum、AVG等等,简单的概念如图1所示。 图1.聚合函数 因此,通常来说,聚合后的行数都要小于聚合前的行数。而对于窗口函数来说,输入结果等于输出结果,举一个简单的例子,如果你计算产品类型A和产品类型B,A产品分5小类,B产品分2小类,应用了窗口函数的结果后可以还是7行,对窗口函数应用了Count后,附加在每一行上,比如说“A产品,A小类1,5“,而B小类则变为”B产品,B小类1,2”最后一列就是应用了窗口函数的结果。 现在我们对窗口函数有了初步的概览,文章后我会提供一些具体的例子来让对窗口函数的概念更加深刻,窗口函数除了上面提到的输入行等于输出行之外,还有如下特性和好处: 类似Group By的聚合 非顺序的访问数据 可以对于窗口函数使用分析函数、聚合函数和排名函数 简化了SQL代码
(消除Join) 消除中间表 窗口函数是整个SQL语句最后被执行的部分,这意味着窗口函数是在SQL查询的结果集上进行的,因此不会受到Group By, Having,Where子句的影响。 窗口函数的典型范例是我们在SQL Server 2005之后用到的排序函数,比如代码清单1所示。 Row_Number() OVER (partition by xx ORDER BY xxx desc) RowNumber
代码清单1.可用于分页的排序函数
因此,我们可以把窗口函数的语法抽象出来,如代码清单2所示。
函数() Over (PARTITION By 列1,列2,Order By 列3,窗口子句) AS 列别名
代码清单2.窗口函数的语法
一个简单的例子
下面我们来看一个简单的例子,假如说我们希望将AdventureWorks示例数据库中的Employee表按照性别进行聚合,比如说我希望得到的结果是:“登录名,性别,该性别所有员工的总数”,如果我们使用传统的写法,那一定会涉及到子查询,如代码清单3所示。
SELECT [LoginID],gender, (SELECT COUNT(*) FROM
[AdventureWorks2012].[HumanResources].[Employee] a WHERE a.Gender=b.Gender) AS GenderTotal FROM
[AdventureWorks2012].[HumanResources].[Employee] b
代码清单3.传统的写法
如果我们使用了窗口函数,代码瞬间就变得简洁,不再需要子查询或Join,如图2所示。
图2.使用窗口函数