锋利的SQL-基于窗口的排名计算

本文详细介绍了SQL Server中的窗口计算,特别是排名函数ROW_NUMBER(), RANK(), DENSE_RANK()和NTILE()的用法。这些函数在处理分组内的排序和排名时非常有用,例如对每个班级的学生按成绩排名。ROW_NUMBER()按行编号,RANK()和DENSE_RANK()用于排名,而NTILE()将数据分发到指定数量的组中。文章通过实例展示了这些函数的使用和执行计划,帮助理解它们的工作原理。" 11907633,1794759,数据文件格式转换C程序实现,"['数据处理', '文件操作', 'C编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL Server中,窗口被定义为用户指定的一组行。

之所以要提出窗口这个概念,因为这种基于窗口或分区的重新计算在实际工作应用范围比较广泛。例如,假设我们要对每个班级中的学生按成绩进行排序,在对第1个班级排序完成后,对第2个班级进行排序时编号需要重新从1开始。在SQL Server 2005之前,像这种排序方式实现起来是比较烦琐的。可以说,对新窗口重新启动计算是窗口计算的重要特点。

为支持窗口计算,SQLServer提供了OVER子句和窗口函数。窗口函数在MSDN Library中被翻译为开窗函数。虽然“开窗函数”理解起来并不如“窗口函数”容易,但是它描述了数据窗口变化后重新启动计算这样一个动作,所以我们尊重MSDN Library中的翻译,在后续的介绍中将使用“开窗函数”这一名词。

窗口计算的两个主要应用就是对每组内的数据进行排序和聚合计算。因此,开窗函数也被分为排名开窗函数和聚合开窗函数。排名开窗函数如ROW_NUMBER( )、RANK( ),聚合开窗函数如AVG( )、SUM等。

进行排名计算时,OVER子句的语法格式如下:

OVER ( [ PARTITION BY value_expression , ... [ n ]]

      <ORDER BY_Clause> )

PARTITION BY value_expression

指定对相应FROM子句生成的行集进行分区所依据的列。开窗函数分别应用于每个分区,并为每个分区重新启动计算。value_expression只能引用通过FROM子句可用的列,不能引用选择列表中的表达式或别名。value_expression可以是列表达式、标量子查询、标量函数或用户定义的变量。

<ORDER BY 子句>

指定应用排名开窗函数的排序顺序。只能引用通过FROM子句可用的列,但是不同通过指定整数来表示选择列表中列名称或列别名的位置。

下面我们将以表9-1所示的Students表为例,进行介绍。像Students表这样的数据结构设计,相对于数据库存储而言是比较合理的,因为我们不可能为每个班级创建一个表,但确实又存在像为每个班级中的学生成绩进行排序或为学生编号这样的实际需求,SQL Server的窗口计算技术就有效解决了二者之间的矛盾。

SQL Server2005开始,提供了4个排名函数,分别是:ROW_NUMBER( )RANK( )DENSE_RANK( )NTILE( ),它们可以为分区中的每一行返回一个排名值。ROW_NUMBER( )用于按行进行编号,RANK( )DENSE_RANK( )用于按指定顺序排名,NTILE( )用于对数据进行分区。

9.2.1 ROW_NUMBER( )

ROW_NUMBER( )返回分区内行的序列号,每个分区的第一行从1开始。例如,下面的语句指定按ClassID进行分区,并按StudentName进行排序编号。查询结果如表9-2所示。

SELECT ClassID, StudentName, Achievement,

      ROW_NUMBER() OVER(PARTITION BY ClassID ORDER BY StudentName) ASRowNumber

FROM Students;

9-2                                                     按班级分区、按学生姓名进行编号

ClassID

StudentName

Achievement

RowNumber

1

Andrew   

99.00

1

1

Grace    

99.00

2

1

Janet    

75.00

3

1

Margaret 

89.00

4

2

Michael  

72.00

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值