SQL Server窗口函数:ROWS与RANGE

摘要:
几乎每次我展示SQLServer里的窗口时,人们都非常有兴趣知道,当你定义你的窗口时,ROWS与RANGE选项之间的区别。ROWS与RANGE之间的区别当你用OVER()子句进行你的分析计算来打开你的窗口,你也可以在窗口里看到的,通过ROWS与RANGE选项来限制你的行数。来看下面的T-SQL语句:1SELECT2t.OrderYear,3t.OrderMonth,4t.TotalDue,5SUMOVERAS'RunningTotal'6FROM7ASt15WHERE16t.SalesPersonID=27417ANDt.OrderYear=200518GO这个T-SQL语句用SUM()聚合函数进行汇总计算。窗口本身从第1行上至当前行。对于记录级中的每1行,窗口变得越来越大,因此很容易进行汇总运算。使用RANGE选项取决于ORDERBY值在窗口里有多少行被包含。

几乎每次我展示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     FROMSales.SalesOrderHeader 
14 ) ASt
15 WHERE
16     t.SalesPersonID = 274
17     AND t.OrderYear = 2005
18 GO

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

SQL Server窗口函数:ROWS与RANGE第1张

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

SQL Server窗口函数:ROWS与RANGE第2张

现在假设你修改窗口为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     FROMSales.SalesOrderHeader 
14 ) ASt
15 WHERE
16     t.SalesPersonID = 274
17     AND t.OrderYear = 2005
18 GO

从下图你可以看到,你得到了不同的结果,对于2005年11月的记录显示同样的汇总。

SQL Server窗口函数:ROWS与RANGE第3张

我们来尝试理解下为什么这里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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【网络】再谈select, iocp, epoll,kqueue及各种I/O复用机制 && Reactor与Proactor的概念vhd0xc0000428winload.exe无法验证此文件的数字签名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

SAP OBA1 外币评估是基于财务目的,为了不影响报表而做的估算值,在月末进行评估,在下月初进行冲回。

评估报告按行项目显示结果。4.评估策略外币的未清项评估有三种策略:1)期末评估,下期初冲回。因此目前每年底改变外币汇率时进行外币余额和未清项的评估,不冲回。②资产负债表指定日,一般是一年的最后一天。③资产负债表准备评估。如果选择该项,则视为年结评估,不能产生冲销凭证。外币未清项评估是按借贷分别统计后做的调整凭证。...

Caused by: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed

春季启动正常启动后,计划任务中的数据库查询报告错误。错误消息如下:1Causedby:org.apache。伊巴提斯。例外情况。PersistenceException:2###错误查询数据库。暂停:org.springframework。jdbc。无法获取JdbcConnection异常:无法获取JDBC连接;3estedexetinisom.alibab...

ubuntu的ufw如何开放特定端口?

ubuntu的ufw是如何打开特定端口的?1.安装sudoapt getinstallufw2.启用sudoufwenable以默认情况下禁用外部访问sudoufwdefaultdeny 3.查看状态sudoufwstatus4.添加端口sudoufwallow80805。删除端口sudoufwdeleteallow808080806。允许特定源的IP地址从...

微信小程序-获取input值的两种方法

1、bindinput其中e.detail是获取input数据其中包含value值,cursor是获取光标的位置。...

Sublime Text 格式化JSON-pretty json

输入prettyjson回车,稍等片刻即可完成安装。...

VS调试异常问题解决(一)

VisualStudio必须是"以管理员身份运行",即鼠标右键"以管理员身份运行",不是指你当前登录的账户是不是Administrator的问题。参考:VS调试时断点无法进入或命中的原因及解决方法当前不会命中断点,还没有为该文档加载任何符号参考:VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”注:在mvc中视图cshtml中,如果代码...