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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

本节书摘来自异步社区出版社《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》一书中的第1章,第1.3节,作者: 【美】Itzik Ben-Gan,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 窗口函数中的元素

T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数
窗口函数的行为描述出现在函数的OVER子句中,并涉及多个元素。3个核心元素是分区、排序和框架。不是所有的窗口函数都支持这3个元素。本节在介绍每个元素时会指出支持它的函数。

1.3.1 分区

分区元素由PARTITION BY子句定义,并被所有的窗口函数支持。它对当前计算的窗口进行限制,仅仅那些在结果集的分区列中与当前行有相同值的行才能进入窗口。例如,如果函数使用PARTITION BY custid,当前行的custid为1,那么对于当前行的窗口就是查询结果集中所有custid值为1的行。如果当前行的custid为2,那么对于当前行的窗口就是所有custid为2的行。

如果没有指定PARTITION BY子句,窗口就没有限制。换种说法就是:如果没有显式地指定分区,则默认分区就是把整个查询结果集当作一个分区。

有一点不太明显,这里提出来:同一个查询中的不同函数,可能会有不同的分区描述。把程序清单1-1内的查询当做一个示例:

程序清单1-1 查询中有两个RANK计算

image

观察第一个RANK函数(它生成rnk_all列),它依赖默认分区,第二个RANK函数(它生成rnk_cust列)使用按照custid进行的显式分区。图1-4显示了在查询中,为3个示例计算结果定义的分区:一个rnk_all值和两个rnk_cust值。

image

箭头从函数的结果值指向用于计算它们所属的窗口分区。

1.3.2 排序

排序元素定义计算的顺序,如果与分区有关,则是在分区内的顺序。在标准SQL中,所有函数都支持排序元素。起初SQL Server不支持聚合函数中的排序元素,而仅仅支持分区。对聚合函数中排序的支持,是从SQL Server 2012开始的。

有趣的是,针对不同的函数类别,排序元素有轻微的不同意义。对于排名函数,排序是直观的。例如,当使用降序排序时,RANK函数返回对应分区内大于当前值的记录的个数加1;当使用升序排序时,函数返回小于当前值的记录的个数加1。图1-5说明了之前列表1-1的排名情况——这次包含了对排序元素的解释。
image

图1-5仅仅展示了在窗口中3行记录的排名计算。当然还有很多——准确地说,有1 660条。原因是有830行记录,对于每一行,都要计算两个排名(升序和降序)。从概念上来说,一个有趣的现象是这么多窗口时同时存在。

聚合窗口函数的排序和排名窗口函数略有意义上的不同。在聚合中,与某些人认为的相反,排序与聚合中的顺序无关;然而,排序元素为下面将要描述的框架选项赋予一定的含义,换句话说,排序元素帮助限定在窗口内的行。

1.3.3 框架

从本质上来说,框架是一个在分区内对行进行进一步限制的筛选器。它适用于聚合窗口函数,也适用于三个偏移函数:FIRST_VALUE、LAST_VALUE和NTH_VALUE。把这个窗口元素想成是基于给定的排序,在当前行所在分区中定义两个点,这两点形成的框架之间的行才会参与计算。

在标准的框架描述中,包含一个ROWS或RANGE选项,用来定义框架的开始行和结束行,这两行也可以形成“框架外”(框架内的行被排除在计算之外)窗口选项。SQL Server 2012开始支持框架,完全实现ROWS选项,部分实现RANGE选项,尚未实现“框架外”窗口选项。

ROWS选项允许我们用相对于当前行的偏移行数来指定框架的起点和终点。RANGE选项更具灵活性,可以以框架起终点的值与当前行的值的差异来定义偏移行数。“框架外”窗口选项用来定义如何对当前行及具有相同值的行进行处置,这样解释不够清晰和充分,但我暂时还不想深入到细节中去,后面会有更多的详述。目前,我只希望介绍概念,并提供一个简单的示例。下面是一个对EmpOrders视图的查询,计算每个员工每个订单月的销售数量累积总计:

我们观察到,窗口函数在qty特性上应用了SUM聚合窗口,用empid进行分区,分区中的行按照ordermonth进行排序,在分区内,按照给定的排序,设定框架为当前行之前的所有行(没有下边界点)。换句话说,结果合计的框架是当前行(包含)之前的所有行。这个查询的部分输出如下:

image

可以看到,窗口的描述跟普通的英语一样简单。第2章提供框架选项的更多细节。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
3月前
|
SQL 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
|
3月前
|
SQL 监控 数据库
MSSQL性能调优实战技巧:索引优化策略、SQL查询重构与并发控制详解
在Microsoft SQL Server(MSSQL)的管理与优化过程中,性能调优是确保数据库高效运行的关键环节
|
3月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
14天前
|
SQL 数据库
SQL:如何使用窗口函数实现高效分页查询??
SQL:如何使用窗口函数实现高效分页查询??
21 0
|
1月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 数据挖掘 Serverless
SQL 窗口函数简直太厉害啦!复杂数据分析的超强利器,带你轻松攻克数据难题,快来一探究竟!
【8月更文挑战第31天】在数据驱动时代,高效处理和分析大量数据至关重要。SQL窗口函数可对一组行操作并返回结果集,无需分组即可保留原始行信息。本文将介绍窗口函数的分类、应用场景及最佳实践,助您掌握这一强大工具。例如,在销售数据分析中,可使用窗口函数计算累计销售额和移动平均销售额,更好地理解业务趋势。
55 0
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
85 13
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
56 6
|
2月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
324 0