几乎每次我展示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选项时有性能上的巨大区别。在接下来的文章我会讨论下这些副作用。

感谢关注!

参考文章:

https://www.sqlpassion.at/archive/2015/01/22/sql-server-windowing-functions-rows-vs-range/

SQL Server窗口函数:ROWS与RANGE相关推荐

  1. 总结SQL Server窗口函数的简单使用

    前言:我一直十分喜欢使用SQL Server2005/2008的窗口函数,排名函数ROW_NUMBER()尤甚.今天晚上我在查看SQL Server开发的相关文档,整理收藏夹发现了两篇收藏已久的好文, ...

  2. 利用T-SQL动态定义重复SQL Server数据库表行

    介绍 (Introduction) Lever T-SQL to handle duplicate rows in SQL Server database tables article highlig ...

  3. SQL 窗口函数:ROWS与RANGE

    SQL Window Funcions https://www.youtube.com/watch?v=H6OTMoXjNiM https://www.youtube.com/watch?v=Tzsr ...

  4. SQL server之窗口函数应用

    1.首先先简单描述一下SQL server的存储过程,通俗的说,就是将一个或多个Transact-SQL语句分组到逻辑单元中,并作为对象存储在数据库服务器中. 当第一次调用存储过程时,SQL Serv ...

  5. SQL Server中的窗口函数

    简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念 ...

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

    本节书摘来自异步社区出版社<T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数>一书中的第1章,第1.7节,作者: [美]Itzik Ben-Gan,更多章节内容可以访 ...

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

    在上一篇中忘记了一个细节.Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避 ...

  8. 《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.2 使用窗口函数的解决方案简介...

    本节书摘来自异步社区出版社<T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数>一书中的第1章,第1.2节,作者: [美]Itzik Ben-Gan,更多章节内容可以访 ...

  9. SQL Server 合并复制遇到identity range check报错的解决

    最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, State ...

最新文章

  1. 构建flutter项目
  2. linux cpu %us,Linux top里面%CPU和us%的解释
  3. 浅谈C++的virtual 动态绑定。
  4. python小游戏编程100例_经典编程100例——python版(例9例10)
  5. 基于socket网络编程技术实现TCP和UDP的流程详解及实例
  6. android 使用Photoshop获取图片某一点的颜色
  7. 【保存】maven的pom.xml标签的xsi:schemaLocation处报错
  8. 百度张亚勤当选美国艺术与科学院院士:今年当选的唯一华人科学家
  9. ios旧版本app网站_这两款app已解锁永久订阅版!
  10. linux多进程分割大文件,Linux中split大文件分割和cat合并文件详解
  11. js截取指定字符分割字符串
  12. 特殊符号大全分享给大家,直接复制粘贴就可以使用了!
  13. 计算机无法上网修复工具,lsp怎么修复解决上不了网问题汇总
  14. DEDECMS站点内容怎么自动更新到新浪微博
  15. 怎样修改IOS程序名称
  16. 基于Java+Swing+Mysql员工信息管理系统
  17. Documentation
  18. 10分钟让你学会百度指数跑分图
  19. 怎么删除w7桌面计算机图标,桌面图标删除不了_Win7桌面有图标删不掉怎么办
  20. Python语言程序设计------测试题【4】

热门文章

  1. java后台 ajax_ajax提交到java后台之后处理数据的实现
  2. python列表切片和推导式思维导图_Python列表推导式使用
  3. python文本相似度分析_文本相似度分析(基于jieba和gensim)
  4. python threading模块中的timer_threading中定时器Timer方法
  5. python iterable对象_如何理解Python中的iterable对象
  6. c字符串中包含双引号_零基础学Python:一文看懂数字和字符串
  7. Linux3种进程,linux内核获取进程的全路径3种方法
  8. Python案例:四种方法判断回文字符串
  9. 大数据学习笔记53:Flume Sink Processors(Flume接收器处理器)
  10. Okhttp3用法案例:查询小车余额