SQL Server窗口函数:ROWS与RANGE

原文:SQL Server窗口函数:ROWS与RANGE

几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWSRANGE选项之间的区别。因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析计算意味着什么。

ROWS与RANGE之间的区别

当你用OVER()子句进行你的分析计算来打开你的窗口,你也可以在窗口里看到的,通过ROWSRANGE选项来限制你的行数。来看下面的T-SQL语句:

 1 SELECT
 2     t.OrderYear,
 3     t.OrderMonth,
 4     t.TotalDue,
 5     SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ‘RunningTotal‘
 6 FROM
 7 (
 8     SELECT
 9         YEAR(OrderDate) AS ‘OrderYear‘,
10         MONTH(OrderDate) AS ‘OrderMonth‘,
11         SalesPersonID,
12         TotalDue
13     FROM Sales.SalesOrderHeader
14 ) AS t
15 WHERE
16     t.SalesPersonID = 274
17     AND t.OrderYear = 2005
18 GO

这个T-SQL语句用SUM()聚合函数进行汇总计算。窗口本身从第1行(UNBOUNDED PRECEDING)上至当前行(CURRENT ROW)。对于记录级中的每1行,窗口变得越来越大,因此很容易进行汇总运算。下图演示了这个概念。

从输出你可以看到,结果是个自增长的汇总——运行合计汇总的结果。

现在假设你修改窗口为RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,会发生什么:

 1 SELECT
 2     t.OrderYear,
 3     t.OrderMonth,
 4     t.TotalDue,
 5     SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ‘RunningTotal‘
 6 FROM
 7 (
 8     SELECT
 9         YEAR(OrderDate) AS ‘OrderYear‘,
10         MONTH(OrderDate) AS ‘OrderMonth‘,
11         SalesPersonID,
12         TotalDue
13     FROM Sales.SalesOrderHeader
14 ) AS t
15 WHERE
16     t.SalesPersonID = 274
17     AND t.OrderYear = 2005
18 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选项时有性能上的巨大区别。在接下来的文章我会讨论下这些副作用。

感谢关注!

时间: 2024-10-14 12:13:32

SQL Server窗口函数:ROWS与RANGE的相关文章

SQL Server 中的窗口函数(2012 新函数)

简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念. 什么是窗口函数 窗口函数,也可以被称为OLAP函数或分析函数.理解窗口函数可以从理解聚合函数开始,我们知道聚合函数的概念,就是将某列多行中的值按照聚合规则合并为一行,比如说Sum.AVG等等,简单的概念如图1所示. 图1.聚合函数 因此,通常来说,聚合后的行数都要小于聚合前的行数.而对于窗口函数

SQL Server 的事务和锁(二)-Range S-S锁

在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死锁分析只好依次顺延了. Range S-S锁的获取规则 MSDN 对 Range 锁的规则有部分描述,但是言简意赅,以下我们会将各种情况分解开来,理清MSDN中涉及的或者未涉及的规则,这些规则适用于SQL Server 2000/2005/2008/2008 R2.关于MSDN的描述,请参见:htt

SQL Server Delete Duplicate Rows

There can be two types of duplication of rows in a table 1. Entire row getting duplicated because there is no primary key or unique key. 2. Only primary key or unique key value is different, but remaining all values are same. Scenario 1: Delete dupli

SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁

在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避免幻读).它由两个部分构成: 第一个部分代表了他锁定了一个索引范围,在这个范围内,所有索引使用 T 锁进行锁定: 第二个部分是而这个范围内已经命中的Key,这些 Key 将使用 K 锁进行锁定. 合并在一起我们说在这个范围内,索引范围和特定的row的锁定模式为 Range T-K. 举上一篇的一个例

(转)SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁

在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避免幻读).它由两个部分构成: 第一个部分代表了他锁定了一个索引范围,在这个范围内,所有索引使用 T 锁进行锁定: 第二个部分是而这个范围内已经命中的Key,这些 Key 将使用 K 锁进行锁定. 合并在一起我们说在这个范围内,索引范围和特定的row的锁定模式为 Range T-K. 举上一篇的一个例

(转)SQL Server 的事务和锁(二)-Range S-S锁

在这篇随笔中,我们的主要关注点在 Key-Range Lock.Key-Range Lock有 S-S.S-U.I-N.X-X几种情况.我们一个一个来说,力求明白.遗憾的是,这里可能会比较冗长,那么死锁分析只好依次顺延了. Range S-S锁的获取规则 MSDN 对 Range 锁的规则有部分描述,但是言简意赅,以下我们会将各种情况分解开来,理清MSDN中涉及的或者未涉及的规则,这些规则适用于SQL Server 2000/2005/2008/2008 R2.关于MSDN的描述,请参见:htt

翻译:《Pro SQL Server Internals, 2nd edition》CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows一节

原文链接:file:///E:/%E2%80%9C%E6%B2%BB%E6%9C%AA%E7%97%85%E2%80%9D%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/Pro%20SQL%20Server%20Internals,%202nd%20edition.pdf 原著:<Pro SQL Server Internals> 作者:Dmitri Korotkevitch 翻译: 数据页面和数据行 数据库中的空间分为逻辑8KB页

(翻译内容)《Pro SQL Server Internals, 2nd edition》的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows一节(即P8~P14)

原文链接:file:///E:/%E2%80%9C%E6%B2%BB%E6%9C%AA%E7%97%85%E2%80%9D%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/Pro%20SQL%20Server%20Internals,%202nd%20edition.pdf 原著:<Pro SQL Server Internals> 作者:Dmitri Korotkevitch 翻译: 数据页面和数据行 数据库中的空间分为逻辑8KB页

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理