背景:在工程项目中,有时需要对数据查询进行展示,常规的表格展示虽然能解决大部分问题;但在数据量比较大的情况就如果一次完整的展示信息,势必会造成数据加载中增加耗时,影响数据的展示效果;常规的解决方案都是在数据加载中采取分页的模式,降低数据的加载耗时;但如果要一次想知道满足条件的查询的结果有多少,就得翻阅到最后一页。
在我后期维护别人的项目就遇到不采用分页一次加载数据的问题,还好运维人员只是想在数据展示中增加一列,显示对应数据的编号从1开始。
初步设想很简单在原始的查询结果前增减一列行号信息,因此我觉得在很简单,使用row_number()函数。
SELECT
row_number() over(order by Age) as rows,
[ID]
,[Name]
,[Age]
,[Gender]
,[Status]
FROM [HTDWork].[dbo].[test] where ID>2
因此我查询了一下row_number()的简介:如下所示:
ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。
语法实例:
select *,row_number() over(partition by column1 order by column2) as n
from tablename
在上面语法中:
PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。
PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。
ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感
当需求有改动后,如果按照按照名称排序后在按照name分组之后在按照age排序
SELECT
row_number() over(partition by Name order by Age) as rows,
[ID]
,[Name]
,[Age]
,[Gender]
,[Status]
FROM [HTDWork].[dbo].[test]
where ID>2
执行结果如下:
由以上可见row_number()方法在使用是必须跟上row_number() over( order by ColumnName),这样在使用中就有了限制,微软官网介绍:
对 SQL Server 中的查询返回的数据进行排序。 可以使用此子句执行以下操作:
-
按指定的列列表对查询的结果集进行排序,并有选择地将返回的行限制为指定范围。 除非指定 ORDER BY 子句,否则,不能保证在结果集中返回的行的顺序。
-
确定将排名函数值应用于结果集的顺序。
语法ÿ