SQL使用Apply实现row_number效果

SQL Server 2005 新增 cross apply 和 outer apply 联接语句,

apply和join操作有什么不一样呢?apply如何使用?

可以参见文章:

T-SQL Apply的用法

使用apply可以轻松实现row_number效果:

举例如下:(问题来自论坛)链接直达:求一个不同班级人对应不同成绩等级的查询!

需求:

不同班级的同学,成绩对应不同等级,且不同等级的数量还不同。如1班分 90分优秀,80分良好,70中等,60分及格四挡,2班分,85分良好,60及格两档。
有表如下,简易的表,如果需要辅助列可以随便加的。
人员表
eid         score          did
人员的id    获得的分数     对应的班级id
1           90             1
2           80             1
3           72             1
4           90             2
5           80             2
6           72             2
等级表
id         score          title
班级id     分数           等级名称
1          90             优秀
1          80             良好
1          70             中等
1          60             及格
2          85             良好
2          60             及格

创建表语句:

create table students(sid int ,score int,did int )
insert into students 
select 1,90,1
union 
select 2,80,1
union
select 3,72,1
union
select 4,90,2
union
select 5,80,2
union
select 6,72,2

create table degres(id int ,score int,title varchar(20))
insert into degres
select 1,90,'优秀'
union 
select 1,80,'良好'
union 
select 1,70,'中等'
union 
select 1,60,'及格'
union 
select 2,85,'良好'
union 
select 2,60,'及格'

实现方法一:使用Row_Number函数和join方法:

联合查询,取大于等级分数中最大的那个等级就可以了(按人分组,order by 等级分数降序,取第一个)

实现代码:

select a.sid,a.score,a.did,a.title from (
select s.*,d.title ,
row_number() over(partition by s.sid order by d.score desc) as n
from students as s
left join degres as d on s.did=d.id
where s.score>=d.score
)as a where n=1

方法二:使用apply函数,实现代码如下:

SELECT students.*,f.title
FROM students OUTER APPLY (
	SELECT TOP 1 deg.title FROM dbo.degres as deg WHERE deg.id=students.did AND students.score>=deg.score ORDER BY deg.score DESC
) AS f
/*
eid	score	did	title
1	90	1	优秀
2	80	1	良好
3	72	1	中等
4	90	2	良好
5	80	2	及格
6	72	2	及格
*/

答案来自CSDN用户分享:吉普赛的歌

分享文章:T-SQL Apply的用法

分享论坛问题:求一个不同班级人对应不同成绩等级的查询!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

向阳的花儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值