排名函数row_number

本文介绍了SQL中的row_number函数,它用于为查询结果的每一行生成唯一序号。通过over子句配合order by子句,可以根据指定字段进行排序。row_number函数的排序与SQL语句中的order by子句作用不同,两者可以独立设置。

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

 在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示:


图1

其中field1字段的类型是intfield2字段的类型是varchar

row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:

 

select  row_number()  over ( order  by  field1)  as  row_number, *  from  t_table

 

    上面的SQL语句的查询结果如图2所示。



图2

    其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。

    实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示:

 

select  row_number()  over ( order  by  field2  desc as  row_number, *  from  t_table  order  by  field1  desc

 

    上面的SQL语句的查询结果如图3所示。



图3
    我们可以使用row_number函数来实现查询表中指定范围的记录,一般将其应用到Web应用程序的分页功能上。下面的SQL语句可以查询t_table表中第2条和第3条记录:

 

with  t_rowtable
as
(
    
select  row_number()  over ( order  by  field1)  as  row_number, *  from  t_table
)
select  *  from  t_rowtable  where  row_number > 1  and  row_number  <  4  order  by  field1

 

    上面的SQL语句的查询结果如图4所示。



图4
    上面的SQL 语句使用了CTE ,关于CTE 的介绍将读者参阅 《SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL》
    另外要注意的是,如果将row_number 函数用于分页处理,over 子句中的order by 与排序记录的order by 应相同,否则生成的序号可能不是有续的。
    当然,不使用row_number 函数也可以实现查询指定范围的记录,就是比较麻烦。一般的方法是使用颠倒Top 来实现,例如,查询t_table 表中第2 条和第3 条记录,可以先查出前3 条记录,然后将查询出来的这三条记录按倒序排序,再取前2 条记录,最后再将查出来的这2 条记录再按倒序排序,就是最终结果。SQL 语句如下:

 

select  *  from  ( select  top  2  *  from select  top  3  *  from  t_table  order  by  field1) a  order  by  field1  desc ) b  order  by  field1

 

    上面的SQL语句查询出来的结果如图5所示。

 

    这个查询结果除了没有序号列row_number,其他的与图4所示的查询结果完全一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值