用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

你可能感兴趣的:(sql)