SQL Sever中三个排序函数row_number()rank()dense_rank()

三个排序函数row_number()rank()dense_rank()
对于row_number()函数,他可以为表排序并返回一个序号

create table score
(学号 nvarchar(10) not null,
课程 nvarchar(10) not null,
成绩 nvarchar(10) not null)
insert into score
values('01','语文',90),
('01','数学',67),
('02','语文',82),
('02','数学',78),
('03','语文',65),
('03','数学',98),
('04','语文',82),
('04','数学',98)

比如最简单的给这个表排序,比如根据学号倒序

select *,row_number()over(order by 学号 desc) 序号 from score 

SQL Sever中三个排序函数row_number()rank()dense_rank()_第1张图片
如图,row_number()over(order by 字段),则会根据你需要的字段进行排序,并给每一行一个编号,但是这些编号是连续的,比如学号为4号的有两行,但是row_number()函数并没有给他们相同的序号也就是排名,也就是说利用这个函数排序不存在相同名次的情况。如果数据的值相同,则先出现的数据排名更靠前。
row_number()函数也能分组进行排序,比如我想知道每门课程的排名情况。

select *,row_number()over(partition by 课程 order by 成绩 desc) 排名 from score 

SQL Sever中三个排序函数row_number()rank()dense_rank()_第2张图片
row_number() over(partition by 字段1 order by 字段2)可以根据字段1先分组然后再组内排名。同样,出现同分的情况不会有相同名次。

对于rank()函数有着类似的用法,也有rank()over(order by 字段) 和rank()() over(partition by 字段1 order by 字段2)两种用法,不同的是rank函数编号的方式不一样。
同样我想知道每门课程的排名情况。

select *,rank()over(partition by 课程 order by 成绩 desc) 排名 from score

SQL Sever中三个排序函数row_number()rank()dense_rank()_第3张图片
看出区别了吗,rank函数会出现同名次的情况,比如两个并列第一名,就没有了第二名。

对于dense_rank()函数也是一样。

select *,desn_rank()over(partition by 课程 order by 成绩 desc) 排名 from score

SQL Sever中三个排序函数row_number()rank()dense_rank()_第4张图片
同样,dense_rank()也会出现同名次的情况,但是依然会接着上一个数连续下去,比如两个并列第一不会挤掉第二名。

你可能感兴趣的:(SQL Sever中三个排序函数row_number()rank()dense_rank())