您的位置:首页 > 数据库

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

2020-03-24 19:24 1106 查看

三个排序函数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


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

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


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


看出区别了吗,rank函数会出现同名次的情况,比如两个并列第一名,就没有了第二名。

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

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


同样,dense_rank()也会出现同名次的情况,但是依然会接着上一个数连续下去,比如两个并列第一不会挤掉第二名。

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
每天发芽的豆芽 发布了7 篇原创文章 · 获赞 3 · 访问量 2万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐