SQL Server窗口框架——ROWS、RANGE

说到窗口框架就不得不提起开窗函数。

开窗函数支持分区、排序和框架三种元素,其语法格式如下:

1 OVER (
2        [ <PARTITION BY clause> ]
3        [ <ORDER BY clause> ]
4        [ <ROW or RANGE clause> ]
5       )  

窗口分区:

就是将窗口指定列具有相同值的那些行进行分区,分区与分组比较类似,但是分组指定后对于整个SELECT语句只能按照这个分组,不过

分区可以在一条语句中指定不同的分区。

1 <PARTITION BY clause> ::=
2 PARTITION BY value_expression , ... [ n ]  

窗口排序:

分区之后可以指定排序列,那么在窗口计算之前,各个窗口的行的逻辑顺序将确定。

1 <ORDER BY clause> ::=
2 ORDER BY order_by_expression
3     [ COLLATE collation_name ]
4     [ ASC | DESC ]
5     [ ,...n ]  

窗口框架:

框架是对窗口进行进一步的分区,框架有两种范围限定方式:一种是使用ROWS子句,通过指定当前行之前或之后的固定数目的行来限制分区中的行数;

另一种是RANGE子句,按照排序列的当前值,根据相同值来确定分区中的行数。

 1 <ROW or RANGE clause> ::=
 2 { ROWS | RANGE } <window frame extent>
 3
 4 <window frame extent> ::=
 5 {   <window frame preceding>
 6   | <window frame between>
 7 }
 8 <window frame between> ::=
 9   BETWEEN <window frame bound> AND <window frame bound>
10
11 <window frame bound> ::=
12 {   <window frame preceding>
13   | <window frame following>
14 }
15
16 <window frame preceding> ::=
17 {
18     UNBOUNDED PRECEDING
19   | <unsigned_value_specification> PRECEDING
20   | CURRENT ROW
21 }
22
23 <window frame following> ::=
24 {
25     UNBOUNDED FOLLOWING
26   | <unsigned_value_specification> FOLLOWING
27   | CURRENT ROW
28 }
29
30 <unsigned value specification> ::=
31 {  <unsigned integer literal> } 

当使用框架时,必须要有ORDER BY子句,如果仅指定了ORDER BY子句而未指定框架,那么默认框架将采用 RANGE UNBOUNDED PRECEDING AND CURRENT ROW。

如果窗口函数没有指定ORDER BY子句,也就不存在ROWS/RANGE窗口的计算。

如果ROWS/RANGE子句采用 <window frame preceding>,那么CURRENT ROW 作为框架的默认结束行,例如:“ROWS 5 PRECEDING” 等价于 “ROWS BETWEEN 5 PRECEDING AND CURRENT ROW”。

PS:RANGE 只支持使用 UNBOUNDED 和 CURRENT ROW 窗口框架分隔符。

未使用 partition by 指定分区示例:

1 select *,
2 sum(U_Id) over(order by U_Id) 列1,
3 sum(U_Id) over(order by U_Id RANGE BETWEEN unbounded preceding AND CURRENT ROW) 列2,
4 sum(U_Id) over(order by U_Id rows  BETWEEN unbounded preceding AND CURRENT ROW) 列3,
5 sum(U_Id) over(order by U_Id rows BETWEEN 1 preceding AND 2 following) 列4,
6 sum(U_Id) over(order by U_Id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) 列5
7 from UserInfo

结果分析:

RANGE 是逻辑窗口,是指定当前行对应值的范围取值,列数不固定,只要行值在范围内,对应列都包含在内。

ROWS 是物理窗口,即根据order by 子句排序后,取的前N行及后N行的数据计算。(与当前行的值无关,只与排序后的行号相关)

【列1】未指定窗口,所以默认为 RANGE UNBOUNDED PRECEDING AND CURRENT ROW,故此与【列2】值相同。

【列2】RANGE BETWEEN unbounded preceding AND CURRENT ROW 表示指定取值范围为 当前行与当前行前面的所有行的值。

即第一行的值为:1  第二行的值为:3+1  第三行的值为:4+3+1

【列3】rows  BETWEEN unbounded preceding AND CURRENT ROW 表示指定取值范围为 当前行与当前行前面的所有行的值。

即第一行的值为:1  第二行的值为:3+1  第三行的值为:4+3+1

【列4】rows BETWEEN 1 preceding AND 2 following 表示指定取值范围为 当前行与前一行和后两行的值。

即第一行的值为:1+3+4  第二行的值为:1+3+4+5  第三行的值为:3+4+5+6

【列5】ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 表示指定取值范围为 当前行与前一行的值。

即第一行的值为:1  第二行的值为:1+3  第三行的值为:3+4

使用 partition by 指定分区示例:

1 select *,
2 sum(U_Id) over(partition by U_Pwd order by U_Id) 列1,
3 sum(U_Id) over(partition by U_Pwd order by U_Id RANGE BETWEEN unbounded preceding AND CURRENT ROW) 列2,
4 sum(U_Id) over(partition by U_Pwd order by U_Id rows  BETWEEN unbounded preceding AND CURRENT ROW) 列3,
5 sum(U_Id) over(partition by U_Pwd order by U_Id rows BETWEEN 1 preceding AND 2 following) 列4,
6 sum(U_Id) over(partition by U_Pwd order by U_Id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) 列5
7 from UserInfo

以上根据 列(U_Pwd)被分为3个区,使用 partition by 指定分区就是先进行分区,然后再根据指定窗口和指定窗口取值范围进行计算。

参考:

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql

时间: 2024-08-25 10:14:55

SQL Server窗口框架——ROWS、RANGE的相关文章

SQL Server窗口函数:ROWS与RANGE

原文:SQL Server窗口函数:ROWS与RANGE 几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWS与RANGE选项之间的区别.因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析计算意味着什么. ROWS与RANGE之间的区别 当你用OVER()子句进行你的分析计算来打开你的窗口,你也可以在窗口里看到的,通过ROWS与RANGE选项来限制你的行数.来看下面的T-SQL语句: 1 SELECT 2 t.OrderYea

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

数据挖掘算法Analysis Services-基于SQL Server的数据挖掘

数据挖掘算法(Analysis Services – 数据挖掘) data mining algorithm is a set of heuristics and calculations that creates a data mining model from data.” xml:space=”preserve”>“数据挖掘算法”是根据数据创建数据挖掘模型的一组试探法和计算. 为了创建模型,算法将首先分析您提供的数据,并查找特定类型的模式和趋势. 算法使用此分析的结果来定义用于创建挖掘模型

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

2014-07-30 MVC框架中对SQL Server数据库的访问

今天是在吾索实习的第16天.我自己主要学习了基于MVC框架的系统的开发时,对SQL Server数据库的相关访问.其步骤如下: 第一步,在Models文件夹中创建一个类,并命名为Movies.cs,如图1所示: 图1 第二步,在上述Movies.cs文件中的namespace MvcTest.Models{}中输入如下代码: 1 public class Movie 2 { 3 public int ID { get; set; } 4 public string Title { get; se

Sql Server来龙去脉系列之二 框架和配置

数据库对象 数据库维持了一系列表存储所有对象.数据类型/约束/配置项/资源等,在2008种我们叫他们为system base tables,并且这些表我们默认是看不到的.我们可以通过管理员登陆数据库,然后执行脚本: USE master; SELECT name FROM sys.objects WHERE type_desc = 'SYSTEM_TABLE'; 能查看到几十条数据.一般我们是不能查看到这些表里边的任何数据,只有通过DAC方式连接数据库才能查看到数据.这些数据主要被数据库引擎使用

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