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-09-01 02:30:31

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

SQL Server窗口函数简介

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

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

第一个部分代表了他锁定了一个索引范围,在这个范围内,所有索引使用 T 锁进行锁定: 第二个部分是而这个范围内已经命中的Key,这些 Key 将使用 K 锁进行锁定. 合并在一起我们说在这个范围内,索引范围和特定的row的锁定模式为 Range T-K. 举上一篇的一个例子吧: SELECT [data] FROM [MyTable] WHERE [index_column]>=20 AND [index_column]<=40 的锁的使用情况是: 实际上,上述语句产生的锁有两个部分,第一个是

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.3 窗口函数中的元素

1.3 窗口函数中的元素 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 窗口函数的行为描述出现在函数的OVER子句中,并涉及多个元素.3个核心元素是分区.排序和框架.不是所有的窗口函数都支持这3个元素.本节在介绍每个元素时会指出支持它的函数. 1.3.1 分区 分区元素由PARTITION BY子句定义,并被所有的窗口函数支持.它对当前计算的窗口进行限制,仅仅那些在结果集的分区列中与当前行有相同值的行才能进入窗口.例如,如果函数使用PARTITION BY custid

深度探讨SQL Server 2005 窗口函数

SQL Server 2005中的窗口函数(window function)与微软Windows无关:相反,它们建立数据窗口.窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地恢复累计总数.移动平均值.以及执行其它计算. 一个SQL Server窗口是对函数应用的行的分区.你使用OVER(-)子句指定一个窗口,你可以对任何一个聚合函数应用这个子句.通常来说,你把数据分成几个组,但OVER()的自变量可选. USE AdventureWorks2;GOSELECT SalesOrderID

深度探讨SQL Server 2005窗口函数

SQL Server 2005中的窗口函数(window function)与微软Windows无关:相反,它们建立数据窗口. 窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地恢复累计总数.移动平均值.以及执行 其它计算. 一个SQL Server窗口是对函数应用的行的分区.你使用OVER(-)子句指定一个窗口,你可以对 任何一个聚合函数应用这个子句.通常来说,你把数据分成几个组,但OVER()的自变量可选. USE AdventureWorks2; GO SELECT SalesOr

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.1 窗口函数的背景

1.1 窗口函数的背景 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 在开始学习具体的窗口函数之前,先了解其背景和内涵,会对后续的学习有所帮助.本节先谈谈窗口函数的背景,解释基于集合方式和基于游标/迭代方式进行查询的不同,以及窗口函数如何对二者的差异进行弥补.最后,本节也提到了窗口函数的替代方法,以及为什么窗口函数会优于其替代方法.注意,尽管窗口函数能非常高效地解决很多问题,但在某些案例中,替代方法会好于窗口函数.第4章会具体谈论对窗口函数的优化,解释在什么情况下,计算

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》导读

前言 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 对我而言,窗口函数是标准SQL和Microsoft SQL Server的语言(T-SQL)所支持的最深奥的特性.它们使得我们可以针对一组数据行进行灵活.清晰而且高效的操作.窗口函数的设计极富创意,克服了传统替代方式的种种不足.窗口函数可以解决的问题非常之广,值得我们投入时间认真学习.SQL Server 2005开始引入窗口函数,SQL Server 2012对已有函数进行了增强,并增加了一些新的函数.本书既覆盖由S

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.7 小结

1.7 小结 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 本章介绍了SQL中窗口的概念,提供了窗口函数的背景,解释了人们使用窗口函数的动机.本章随后提供了一个使用窗口函数完成查询任务的案例简介--标识序列中存在的值的区间--又称为标识数据岛.然后本章对窗口函数的设计进行了解释,包括窗口描述中涉及的元素:分区.排序.框架.最后,本章解释了标准SQL如何解决窗口描述或部分描述的重复使用问题.第2章将对窗口函数进行分别讲解,进入更多的细节. 本文仅用于学习和交流目的,不代表

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.6 窗口定义的重复使用

1.6 窗口定义的重复使用 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 假设我们需要在同一个查询中调用多个窗口函数,并且部分窗口描述(或所有描述)适用于多个函数.如果我们在所有函数中都给出完整的窗口描述,代码的长度会急速增加,从下面的示例中可以看到问题: 标准SQL对此有解决方法,它有一个叫做WINDOW的子句,允许我们对窗口描述或部分窗口描述进行命名:然后在定义其他窗口--即将被窗口函数使用或用来定义另一个命名窗口时,指代这个命名的窗口描述.从概念上来说,这个子句在