sqlserver开窗函数
从 http://jimshu.blog.51cto.com/3171847/1376637/ 转
开窗函数是在 ISO 标准中定义的。SQL Server 提供排名开窗函数和聚合开窗函数。
在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。SQL Server 2005 引入了开窗函数,使得这些经典的难题可以被轻松的解决。
窗口是用户指定的一组行。开窗函数计算从窗口派生的结果集中各行的值。开窗函数分别应用于每个分区,并为每个分区重新启动计算。
OVER 子句用于确定在应用关联的开窗函数之前,行集的分区和排序。PARTITION BY 将结果集分为多个分区。
一、排名开窗函数
1. 语法
|
Ranking Window Functions < OVER_CLAUSE > :: = OVER ( [ PARTITION BY value_expression , ... [ n ] ] <ORDER BY_Clause> ) |
注意:ORDER BY 子句指定对相应 FROM 子句生成的行集进行分区所依据的列。value_expression 只能引用通过 FROM 子句可用的列。value_expression 不能引用选择列表中的表达式或别名。value_expression 可以是列表达式、标量子查询、标量函数或用户定义的变量。
2. 示例
可参考 http://jimshu.blog.51cto.com/3171847/1176067
二、聚合开窗函数
1. 语法
|
Aggregate Window Functions < OVER_CLAUSE > :: = OVER ( [ PARTITION BY value_expression , ... [ n ] ] ) |
2. 示例
下例将根据 SalesOrderID 进行分区,然后为每个分区分别统计SUM、AVG、COUNT、MIN、MAX。
|
SELECT SalesOrderID, ProductID, OrderQty ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total' ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg' ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count' ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min' ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max' FROM SalesOrderDetail WHERE SalesOrderID IN(43659,43664); |
下例首先由 SalesOrderID 分区进行聚合,并为每个 SalesOrderID 的每一行计算 ProductID 的百分比)。
|
SELECT SalesOrderID, ProductID, OrderQty ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total' ,CAST(1.0 * OrderQty / SUM(OrderQty) OVER(PARTITION BY SalesOrderID) *100 AS DECIMAL(5,2))AS 'Percent by ProductID' FROM SalesOrderDetail WHERE SalesOrderID IN(43659,43664); |
3. SQL Server 2012 增加功能
SQL Server 2012 为聚合函数提供了窗口排序和框架支持,可以将 OVER 子句与函数一起使用,以便计算各种聚合值,例如移动平均值、累积聚合、运行总计或每组结果的前 N 个结果。
更多详情,请参考 http://technet.microsoft.com/zh-cn/library/ms189461(v=sql.110).aspx
三、分析开窗函数
可参考 http://jimshu.blog.51cto.com/3171847/1176191
四、NEXT VALUE FOR 函数
通过将 OVER 子句应用于 NEXT VALUE FOR 调用,NEXT VALUE FOR 函数支持生成排序的序列值。 通过使用 OVER 子句,可以向用户保证返回的值是按照 OVER 子句的 ORDER BY 子子句的顺序生成的。
例如:
|
SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber, FirstName, LastName FROM Person.Contact ; |
详情请参考 http://technet.microsoft.com/zh-cn/library/ff878370.aspx
sqlserver开窗函数的更多相关文章
- sqlserver开窗函数在财务对账中的用法
曾几何时发现开窗函数在财务对账总特别好用.但是每次可能很久没用,逻辑都要重头来过.特此留一份完整的思考逻辑待日后参考. 以下是数据源: 从上面的数据可以看到通过C列,那么只需要两个条件即可获得已经用对 ...
- sqlserver 开窗函数Over()的使用
利用over(),将统计信息计算出来,然后直接筛选结果集 declare @t table(ProductID int,ProductName varchar(20),ProductType varc ...
- sqlserver开窗函数改造样例
作一个查询的性能优化. 先清缓存 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 原查询 前人遗留. ) ),) select @total=sum(price*pe ...
- SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数
Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下: ...
- SQLserver 连接+开窗函数+视图+事务
今天学习SQLserver 连接以及开窗函数..加油! 1.复习:查询(检索)->筛选列->筛选行:distinct top where 运算符与关键字:比较运算符,逻辑运算符,betwe ...
- sqlserver的over开窗函数(与排名函数或聚合函数一起使用)
首先初始化表和数据 create table t_student( Id INT, Name varchar(), Score int, ClassId INT ); insert i ...
- 开窗函数 First_Value 和 Last_Value
在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...
- Oracle开窗函数 over()(转)
copy文链接:http://blog.csdn.net/yjjm1990/article/details/7524167#,http://www.2cto.com/database/201402/2 ...
- oracle的分析函数over 及开窗函数
转:http://www.2cto.com/database/201310/249722.html oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开 ...
随机推荐
- [Selenium] 数字显示的月份转换为英文显示
如果只需要英文的前三位字母,可以自己截取.
- Retrofit 2.0使用(2)如何使用@Body的形式发送Post
在使用Retrofit的时候如果只是有几个参数我们可以用@Querry的形式,然后需要使用','隔开 但是在需要@Querry的参数多了之后,如果再用上面的方式就会造成参数写了一大堆的麻烦事 所以Re ...
- Django1.9开发博客(8)- 继续完善
到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的 ...
- mysql 中关于周和月份的表示
本周:YEARWEEK(date_format(create_time,'%Y-%m-%d')) = YEARWEEK(now()) 上周:YEARWEEK(date_format(create_ti ...
- MVC5 + EF6 入门完整教程一:从0开始
第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定" 会让人困惑,而且东西太多容易忘记 ...
- 删除桌面IE图标
B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B HKEY_USERS\S-1-5-21-3567631753-1637826720-2857290141-500\Softwa ...
- BZOJ4049 [Cerc2014] Mountainous landscape
首先对于一个给定的图形,要找到是否存在答案非常简单... 只要维护当然图形的凸包,看一下是否有线段在这条直线上方,直接二分即可,单次询问的时间复杂度$O(logn)$ 现在用线段树维护凸包,即对于一个 ...
- Html=>Head=>meta
如今智能机遍布大街小巷,所以,如今的前端攻城师们要大 跨步的迈向移动互联网了,更何况Web App也应用广泛,可能原理还一样,但是一定会有新的东西出现,那就从“头”开始,看看头部那些Meta的新玩意. ...
- Halcon 10.0 Sample:完整性检查(圆形)
* ball.hdev: Inspection of Ball Bonding * 球接合检查 Comment Time:// *核心思想:.白色区域用作自动ROI,黑色区域是目标 * .Openin ...
- 设计模式六大原则(5)—迪米特法则
定义: 一个对象应该对其它的对象保持最少的了解.迪米特法则又称为最少知识法则,英文全称为Least Knowledge Principle ,简称为LKP. 个人理解: 迪米特法则主要目的是类间解耦, ...