用CROSS APPLY解开了困扰我一年多的一个问题

假设有一个表叫SongsTop,是歌曲下载情况的记录。

 

Star,SongName,Hot

周杰伦,乔克叔叔,2861

周杰伦,稻香,4842

周杰伦,兰亭序,2656

周杰伦,流浪诗人,1568

S.H.E,酸甜,1479

S.H.E,月光手札,1138

S.H.E,店小二,715

S.H.E,熬夜DJ,538

S.H.E,天亮了,931

张信哲,天使的眼泪,3189

张信哲,长途旅行,7075

张信哲,牧羊人,1235

张信哲,最好的时光,1618

弦子,醉清风,1848

弦子,不爱最大,439

弦子,蒙娜丽莎,688

王若琳,因为你爱我,734

王若琳,For No Reason(国语),623

王若琳,迷宫,599

王若琳,We've Only Just Begun,659

 

现在要求,列出每位歌手的下载量最大的三条记录。禁止用游标。

 

我的方案,不知道有没有更简单的方法:

 

1 建立一个表值函数:

CREATE FUNCTION [dbo].[GetTop]

(  

    @Star varchar(50)

)

RETURNS TABLE

AS

RETURN

(

    select top 3 Star,SongName,Hot from songstop where star = @Star order by hot desc

)

 

2 SQL查询:

select distinct b.star,b.songname,b.hot from songstop s

cross apply dbo.GetTop(s.star) b

order by star asc,hot desc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值