SQL 分组排序的窗口函数 rank, dense_rank, row_number

建表

create table score 
( 
	name varchar(20), 
	subject varchar(20), 
	score int 
);
-- 2.插入测试数据 
insert into score(name,subject,score) values('张三','语文',98);
insert into score(name,subject,score) values('张三','数学',80);
insert into score(name,subject,score) values('张三','英语',90);
insert into score(name,subject,score) values('李四','语文',88);
insert into score(name,subject,score) values('李四','数学',86);
insert into score(name,subject,score) values('李四','英语',88);
insert into score(name,subject,score) values('李明','语文',60);
insert into score(name,subject,score) values('李明','数学',86);
insert into score(name,subject,score) values('李明','英语',88);
insert into score(name,subject,score) values('林风','语文',74);
insert into score(name,subject,score) values('林风','数学',99);
insert into score(name,subject,score) values('林风','英语',59);
insert into score(name,subject,score) values('严明','英语',96);

rank

select 
  subject, 
  name, 
  score, 
  rank() over (partition by subject order by score) as rank 
from score;

在这里插入图片描述

dense_rank

select 
  subject, 
  name, 
  score, 
  dense_rank() over (partition by subject order by score) as rank 
from score;

在这里插入图片描述

row_number

select 
  subject, 
  name, 
  score, 
  row_number() over (partition by subject order by score) as rank 
from score;

在这里插入图片描述
使用场景:
如果需要找出 topN 的学生,允许第N名并列,则用 rank()
如果需要找出 topN 的分数和对应的学生,允许结果远大于N人,则用 dense_rank()
如果只要找出N个人,多一个也不行,则用row_number()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值