文章摘要
这篇文章介绍了SQL Server中的`ROW_NUMBER()`函数,该函数用于为结果集的分区中的每一行分配一个连续的整数。基本语法如下:
`ROW_NUMBER() OVER (PARTITION BY [分组列] ORDER BY [排序列])`
`PARTITION BY`子句将结果集划分为多个分区,在每个分区中重新初始化行号。`ORDER BY`子句定义了分区内的行逻辑顺序。`ROW_NUMBER()`函数对顺序敏感,必须使用`ORDER BY`子句。
文章通过示例展示了如何使用`ROW_NUMBER()`函数对数据表中的课程、分数和学号进行排序。例如,根据课程`cno`分区排序,当`cno`变化时,`ROW_NUMBER()`会重新开始计数。然后按分数降序排列,以便显示每科成绩及其对应的学号。
如果没有`PARTITION BY`子句,`ROW_NUMBER()`会将整个结果集视为一个分区,行号从1开始连续计数。此外,文章还介绍了与`ROW_NUMBER()`函数相关的其他函数,如`RANK()`和`DENSE_RANK()`,并解释了它们在排序时的区别:`RANK()`会跳过空值,而`DENSE_RANK()`不会跳过空值。
总结而言,这篇文章详细介绍了`ROW_NUMBER()`函数的用法、语法和示例应用,并与其他排序函数进行了对比,帮助读者更好地理解和使用该函数。
Row_number()函数是SQL SERVER系统函数中的一种,它为结果集的分区中的每一行分配一个连续的整数。简单的说就是生成一个独表,序号以每个分区的第一行开头,下面是其基本语法:

PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感。OVER()是一个开窗函数,对集合进行聚合计算
举个例子,用row_number()函数对以下数据表单进行课程,分数高低及学号排序

sno为学号,cno为所学课程,score为成绩
得到以下语法和查询结果:

可以看到ID的值以cno为分区进行排序,当cno变化时ID也会自动重新开始计数,然后再将成绩以降序排列,这样每科成绩高低及其对应的学号就一目了然。
如果没有partition by则row_number()将整个结果集视为一个分区:

ID的值将一直排到最后。
当row_number()与where一起使用时,可以将row_number()封装成一个子查询,如下只看每科前两名的数据:

将整个函数方法封装命名为a,再从a里面提取需要的条件。
在这里我还要补充一下row_number()函数以外的一个rank()和dense_rank()函数,有时候如果第一名有两个以上的同学时,row_number()函数只会显示一个,而用rank()和dense_rank()则可以全部显示出来(这两个的区别是前者会跳跃排序,后者不会),如图:

到此这篇关于Row_number()函数用法小结的文章就介绍到这了,更多相关Row_number()用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:SQL中row_number()?over(partition?by)的用法说明MySQL中rank() over、dense_rank() over、row_number() over用法介绍MYSQL row_number()与over()函数用法详解PostgreSQL ROW_NUMBER() OVER()的用法说明SQL中distinct 和 row_number() over() 的区别及用法Mysql row number()排序函数的用法和注意深入探讨:oracle中row_number() over()分析函数用法