sql逻辑题08

实现每班前三名,分数一样并列, 同时求出前三名按
名次排序的分差

 当我们看到前3名首先要想到开窗函数 row_number() over()、rank()over()、dense_rank() over(),在这里我们要强调一下这三者的区别, row_number() over()按照名词排序名词不会重复即使成绩一样,rank()over()会出现并列的情况,dense_rank() over()名词跳跃。这道题要求“分数一样时并列”我们用rank()over()。

数据准备:

--创建表
create table student(
sid varchar(20),-- 学号
cid varchar(20),-- 班级号
score1 int -- 分数
);

--插入数据
insert into student values
('1','1901',90)
,('2','1901',90)
,('3','1901',83)
,('4','1901',60)
,('5','1902',66)
,('6','1902',23)
,('7','1902',99)
,('8','1902',67)
,('9','1902',87);

 在这里我们使用到了lead函数来获取基于当前数据的下一条记录。上一个博客中有详细记录

https://mp.csdn.net/mp_blog/creation/editor/127857879

sql实现:

-- 实现每班前三名,分数一样并列, 同时求出前三名按
-- 名次排序的分差

select t1.sid,t1.cid,t1.score1,t1.score1-t1.nextscore from(
select sid,cid,score1,rank() over(partition by cid order by score1 desc) rk ,lead(score1,1,0) over(partition by cid order by score1 desc) nextscore from student
) t1 where t1.rk<=3

sql实现结果如下:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值