查询每个歌手下载量最大的三条数据

假设有一个表叫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

第二种方案

不建立函数,直接使用内置的PARTITIONROW_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
原文地址:https://www.cnblogs.com/darkiller/p/2716528.html