SQL Server窗口函数:ROWS与RANGE
几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWS与RANGE选项之间的区别。因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析计算意味着什么。
ROWS与RANGE之间的区别
当你用OVER()子句进行你的分析计算来打开你的窗口,你也可以在窗口里看到的,通过ROWS与RANGE选项来限制你的行数。来看下面的T-SQL语句:
SELECT
t.OrderYear,
t.OrderMonth,
t.TotalDue,
SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 'RunningTotal'
FROM
(
SELECT
YEAR(OrderDate) AS 'OrderYear',
MONTH(OrderDate) AS 'OrderMonth',
SalesPersonID,
TotalDue
FROM Sales.SalesOrderHeader
) AS t
WHERE
t.SalesPersonID = 274
AND t.OrderYear = 2005
GO
这个T-SQL语句用SUM()聚合函数进行汇总计算。窗口本身从第1行(UNBOUNDED PRECEDING)上至当前行(CURRENT ROW)。对于记录级中的每1行,窗口变得越来越大,因此很容易进行汇总运算。下图演示了这个概念。
从输出你可以看到,结果是个自增长的汇总——运行合计汇总的结果。
现在假设你修改窗口为RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,会发生什么:
SELECT
t.OrderYear,
t.OrderMonth,
t.TotalDue,
SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 'RunningTotal'
FROM
(
SELECT
YEAR(OrderDate) AS 'OrderYear',
MONTH(OrderDate) AS 'OrderMonth',
SalesPersonID,
TotalDue
FROM Sales.SalesOrderHeader
) AS t
WHERE
t.SalesPersonID = 274
AND t.OrderYear = 2005
GO
从下图你可以看到,你得到了不同的结果,对于2005年11月的记录显示同样的汇总。
我们来尝试理解下为什么这里RANGE选项比ROWS选项给你不同的结果。使用ROWS选项你定义当前行的固定前后记录。这里你看到的行取决于窗口的ORDER BY从句。你也可以说你在物理级别定义你的窗口。
当你使用RANGE选项事情就改变了。RANGE选项包含窗口里的所有行,和当前行有相同ORDER BY值。从刚才的图片你可以看到,对于2005年11月的2条记录你拿到同个汇总,因为这2行有同样的ORDER BY值(2005年11月)。使用RANGE选项你在逻辑级别定义你的窗口。如果更多的行有同个ORDER BY值,当你使用ROWS选项你的窗口会包含更多的行。
小结
在今天的文章里你看到了当你为你的分析计算定义窗口时,ROWS和RANGE选项之间的区别。使用ROWS选项你在物理级别定义在你窗口里有多少行。使用RANGE选项取决于ORDER BY值在窗口里有多少行被包含。因此当你使用RANGE选项时有性能上的巨大区别。在接下来的文章我会讨论下这些副作用。
感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/01/22/sql-server-windowing-functions-rows-vs-range/
SQL Server窗口函数:ROWS与RANGE的更多相关文章
- (4.34)sql server窗口函数
关键词:sql server窗口函数,窗口函数,分析函数 如果分析函数不可用,那么可能是版本还不支持 Window Function 包含了 4 个大类.分别是: 1 - Rank Function ...
- 总结SQL Server窗口函数的简单使用
总结SQL Server窗口函数的简单使用 前言:我一直十分喜欢使用SQL Server2005/2008的窗口函数,排名函数ROW_NUMBER()尤甚.今天晚上我在查看SQL Server开发的相 ...
- SQL Server 窗口函数详解:OVER()
语法 开窗函数支持分区.排序和框架三种元素,其语法格式如下: OVER ( [ <PARTITION BY clause> ] [ <ORDER BY clause> ] [ ...
- SQL Server进阶 窗口函数
概述 设计窗口函数目的? 在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成. 为了解决这些问题,在 2003 年 ISO SQL 标准加入了 ...
- SQL Server 中的窗口函数(2012 新函数)
简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念 ...
- SQL Server中的窗口函数
简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函 ...
- SQL Server 合并复制遇到identity range check报错的解决
最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, S ...
- (转)SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...
- (转)SQL Server 的事务和锁(二)-Range S-S锁
在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死 ...
随机推荐
- eclipse,myeclipse开发环境下,maven远程部署到tomcat7服务器(图文)
有的人想在eclipse写java web 项目,通过maven也是一种实现的方法,可以实现java web 项目打包成war,发布到tomcat. 在pom.xml文件的build增加下面的代码,相 ...
- 虚方法的调用是怎么实现的(单继承VS多继承)
我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确 ...
- angular post表单
参数文章:http://angularjs.cn/A0qF angularjs中Post使用的是json的交互方法,一般服务器还没达到这个阶段,我们可以用回传统的&参数的方法: var myA ...
- 内部通信服务Factory(WCF)
WCF,很好,却又麻烦,很多时候不想用WCF的原因就是:用这个真麻烦... 麻烦的地方,比如: 一堆一堆的服务配置,散落在一个一个的folder下,更新系统时容易出错 客户端除了要知道WCF Cont ...
- Mac Port 基本用法总结
Mac Port 基本用法总结 Mac Port 基本用法总结 1. Mac Port的下载地址 http://www.macports.org/install.php 2. Mac Port的说明文 ...
- Hibernate不调用update却自动更新
案例: TInfCustomer cus = (TInfCustomer) this.baseDao.getOne(helper); cus.setXXX cus .setXXX 不调用update也 ...
- context:annotation-config 与context:component-scan
<context:annotation-config/> <context:component-scan base-package="com.xx" /> ...
- Win8.1 远程桌面 凭据无法工作
最近遇到一个杯具的事情 电脑重装完系统后,发现 win7/server08/server12 无法远程到我的电脑了- 每次连接都显示如下: 灵异的是从 xp 和 server03 能远程进来- ...
- httpwebrequest 服务器提交了协议冲突. section=responsestatusline
调用接口的时候,包: httpwebrequest 服务器提交了协议冲突. section=responsestatusline 解决方案: req.KeepAlive = false; req.Al ...
- 浅析 mondrian 模式文件 Schema
1.前言 前面几篇文章一经介绍过saiku.模式文件和MDX的关系.通俗点说模式文件(Schema)就是一个xml,里面定义了一个虚拟立方体,共MDX查询语言使用. 2.模式文件 Schema 最顶层 ...