SQLServer窗⼝函数:ROWS与RANGE
⼏乎每次我展⽰SQL Server⾥的窗⼝时,⼈们都⾮常有兴趣知道,当你定义你的窗⼝(指定的⼀组⾏)时,ROWS与RANGE选项之间的区别。因此在今天的⽂章⾥我想给你展⽰下这些选项的区别,对于你的分析计算意味着什么。
国庆节作文300字作文ROWS与RANGE之间的区别
当你⽤OVER()⼦句进⾏你的分析计算来打开你的窗⼝,你也可以在窗⼝⾥看到的,通过ROWS与RANGE选项来限制你的⾏数。来看下⾯的T-SQL语句:
1SELECT
小蜜蜂吉他谱2 t.OrderYear,
3 t.OrderMonth,
4 t.TotalDue,
5SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS'RunningTotal'
6FROM
7 (
8SELECT
9YEAR(OrderDate) AS'OrderYear',
10MONTH(OrderDate) AS'OrderMonth',
11 SalesPersonID,
12 TotalDue
13FROM Sales.SalesOrderHeader
14 ) AS t
15WHERE
16 t.SalesPersonID =274
17AND t.OrderYear =2005
郑州大专院校排名18GO
这个T-SQL语句⽤SUM()聚合函数进⾏汇总计算。窗⼝本⾝从第1⾏(UNBOUNDED PRECEDING)上⾄当前⾏(CURRENT ROW)。对于记录级中的每1⾏,窗⼝变得越来越⼤,因此很容易进⾏汇总运算。下图演⽰了这个概念。
从输出你可以看到,结果是个⾃增长的汇总——运⾏合计汇总的结果。
现在假设你修改窗⼝为RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,会发⽣什么:
1SELECT
团队工作
2 t.OrderYear,
3 t.OrderMonth,
4 t.TotalDue,
5SUM(t.TotalDue) OVER(ORDER BY t.OrderYear, t.OrderMonth RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS'RunningTotal'
6FROM
7 (
亲情作文题目8SELECT
9YEAR(OrderDate) AS'OrderYear',
10MONTH(OrderDate) AS'OrderMonth',
学习电脑制表格
11 SalesPersonID,
12 TotalDue
13FROM Sales.SalesOrderHeader
14 ) AS t
15WHERE
16 t.SalesPersonID =274
17AND t.OrderYear =2005
18GO
从下图你可以看到,你得到了不同的结果,对于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选项之间的区别。使⽤R
OWS选项你在物理级别定义在你窗⼝⾥有多少⾏。使⽤RANGE选项取决于ORDER BY值在窗⼝⾥有多少⾏被包含。因此当你使⽤RANGE选项时有性能上的巨⼤区别。在接下来的⽂章我会讨论下这些副作⽤。