假设有一个表叫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) ) RETURNSTABLE AS RETURN ( selecttop 3 Star,SongName,Hot from songstop where star = @Star orderby hot desc )
2 SQL查询:
SELECT DISTINCT b.star,b.songname,b.hot FROM songstop s CROSS APPLY dbo.GetTop(s.star) b ORDERBY star asc,hot DESC
第二种方案
不建立函数,直接使用内置的PARTITION和ROW_NUMBER函数
SELECT * FROM (SELECT Star,SongName,Hot,ROW_NUMBER() OVER (PARTITION BY Star ORDER BY Hot DESC) AS ROWNO FROM songstop ) a WHERE ROWNO <= 3