SqlServer2005新增排序函数实例解释

本文详细介绍了SQL中的窗口函数,包括row_number(), rank(), dense_rank() 和 ntile() 的使用方法及应用场景。通过实例展示了如何利用这些函数进行数据排序、分组和高效分页等操作。

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

一、初始化数据:以用户成绩表为例

create database demo

use demo
create table T_User
(
      UserId 
varchar(32not null primary key,UserName varchar(64not null,Score int not null
)

insert into T_User(UserId,UserName,Score) values('pd002','Steven',78)
insert into T_User(UserId,UserName,Score) values('pd001','James',80)
insert into T_User(UserId,UserName,Score) values('pd003','Allen',80)
insert into T_User(UserId,UserName,Score) values('pd004','Brue',86)
insert into T_User(UserId,UserName,Score) values('pd005','Evens',93)

二、row_number()是通过对特定列来排序,比如成绩:

use demo
select row_number() over(order by Score descas RowId,*
from T_User

结果:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
1                    pd005                            Evens                                                            93
2                    pd004                            Brue                                                             86
3                    pd002                            James                                                            80
4                    pd003                            Allen                                                            80
5                    pd001                            Steven                                                           78

三、rank()排序字段相同的记录占有名次

use demo
select rank() over(order by Score descas RowId,*
from T_User

结果:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
1                    pd005                            Evens                                                            93
2                    pd004                            Brue                                                             86
3                    pd002                            James                                                            80
3                    pd003                            Allen                                                            80
5                    pd001                            Steven                                                           78

四、dense_rank() 排序字段相同的记录同占一个名次

use demo
select dense_rank() over(order by Score descas RowId,*
from T_User

结果:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
1                    pd005                            Evens                                                            93
2                    pd004                            Brue                                                             86
3                    pd002                            James                                                            80
3                    pd003                            Allen                                                            80
4                    pd001                            Steven                                                           78

五、ntile() 是按排序字段把结果分成几个等级

use demo
select ntile(3over(order by Score descas RowId,*
from T_User

结果:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
1                    pd005                            Evens                                                            93
1                    pd004                            Brue                                                             86
2                    pd002                            James                                                            80
2                    pd003                            Allen                                                            80
3                    pd001                            Steven                                                           78

六、另外可以利用row_number()进行高效分页

--@PageSize为每页数据多少,@PageIndex为当前页
use demo

declare @PageSize int
set @PageSize=2
declare @PageIndex int
set @PageIndex=2

select top(@PageSize*
from
(
    
select row_number() over(order by Score descas RowId,*
    
from T_User
) T_User_Score
where RowId between ((@PageIndex -1)*@PageSize +1and @PageSize*@PageIndex

分页数据:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
3                    pd002                            James                                                            80
4                    pd003                            Allen                                                            80

全部数据:

RowId                UserId                           UserName                                                         Score
-------------------- -------------------------------- ---------------------------------------------------------------- -----------
1                    pd005                            Evens                                                            93
2                    pd004                            Brue                                                             86
3                    pd002                            James                                                            80
4                    pd003                            Allen                                                            80
5                    pd001                            Steven                                                           78
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值