SQL面试题挑战13:分组topN

SQL面试题挑战13:分组topN

问题

问题:下面是某个班级的成绩表,需要筛选出每个科目前2名的学生信息。如果分数一样,名次是并列的,后面的同学名次就不连续。比如有2个同学是第一名,那么下一个同学的名次就是第3名,呈现1,1,3的名次排列。

stu_id  stu_name    subject     score
1001    张三        语文           90
1001    张三        数学           80
1001    张三        英语           70
1002    李四        语文           90
1002    李四        数学           75
1002    李四        英语           80
1003    王五        语文           80
1003    王五        数学           70
1003    王五        英语           60

建表语句

drop table if exists scores;
create table scores(
    stu_id varchar(20),
    stu_name varchar(20),
    subject varchar(10),
   score decimal(10,2)
);
insert into scores values
('1001','张三', '语文',90),
('1001','张三', '数学',80),
('1001','张三', '英语',70),
('1002','李四', '语文',90),
('1002','李四', '数学',75),
('1002','李四', '英语',80),
('1003','王五', '语文',80),
('1003','王五', '数学',70),
('1003','王五', '英语',60)

解答

思路:

使用rank即可

完整查询如下

select
    *
from
    (
        select
            stu_id,
            stu_name,
            subject,
            score,
            rank() over (partition by subject order by score)rk
        from
            scores
    )t
where
    rk<3
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值