0

例如,我有如下数据,我想使用group bylimit选择每个艺术家前 2 名最多明星的歌曲,并对明星进行总和,但它不起作用

select sum(stars) from fav_songs group by artist order by stars desc limit 2;

我想要的结果是这样的:

600 -> taylor swift  
350 -> eminem  
520 -> linkin park  

sqlite3 或 mysql 都很好

表名:fav_songs

| id | artist       | song           | stars |  
+----+--------------+----------------+-------+  
|  1 | Taylor Swift | Love Story     |   100 |  
|  2 | Taylor Swift | Enchanted      |   200 |  
|  3 | Taylor Swift | Safe and Sound |   400 |  
|  4 | Taylor Swift | Style          |   110 |  
|  5 | Eminem       | 8 Mile         |   200 |  
|  6 | Eminem       | the monster    |   100 |  
|  7 | Eminem       | lose yourself  |   150 |  
|  8 | Linkin Park  | in the end     |   210 |  
|  9 | Linkin Park  | faint          |    90 |  
| 10 | Linkin Park  | numb           |   310 |  

顺便说一句,stackoverflow的编辑器不支持markdown表??

4

2 回答 2

3

您可以使用带有聚合的相关子查询:

select fs.artist, sum(fs.stars) 
from fav_songs fs
where fs.id in (select fs1.id 
                from fav_songs fs1 
                where fs1.artist = fs.artist 
                order by f1.stars desc 
                limit 2
               )
group by fs.artist; 

如果您的版本支持排名功能,那么您可以:

select fs.artist, sum(fs.stars)
from (select fs.*, 
             row_number() over(partition by fs.artist order by fs.stars desc) as seq
      from fav_songs fs
     ) fs
where fs.seq <= 2
group by fs.artist
于 2020-01-08T15:16:57.693 回答
1

如果您正在运行支持窗口函数的 RDBMS,则可以使用行号:

select artist, sum(stars)
from (
    select t.*, row_number() over(partition by artist order by stars desc) rn
    from fav_songs
) t
where rn <= 2
group by artist
于 2020-01-08T15:17:37.087 回答