[SQL Server习题] 每组ID薪水前N名

取表中每组id的TOP 2 salary

#创建表
create table student(id int,salary float,name varchar(255));
insert into student values
(1,25,'zhang'),
(1,75,'shan'),
(2,38,'li'),
(2,58,'si'),
(3,56,'wu'),
(4,68,'wang'),
(4,78,'jia'),
(4,32,'yi'),
(2,26,'bing'),
(4,98,'ding'),
(3,86,'xiong');
idsalaryname
125zhang
175shan
238li
258si
356wu
468wang
478jia
432yi
226bing
498ding
386xiong

解题思路

(1)row_number() over (partition by col_1 order by col_2 desc)按照col_1分组,其中按col_2 降序排列,并生成一个新的字段rowNum;
(2)选择rowNum < 3,即为前2名;
(3)order by id, salary desc,按照id升序,salary降序排列。

实现代码

select id, name, salary
from (select *, row_number() over (partition by id order by salary desc) as row_num from student) a
where a.row_num <3
order by a.id, a.salary desc;        #按照id升序,salary降序排列

结果

idnamesalary
1shan75
1zhang25
2si58
2li38
3xiong86
3wu56
4ding98
4jia78
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值