如何使用 sql 分组依据到 select 前 2 项并对一个字段求​​和?

How to use sql group by to select top 2 items and sum one field?

例如,我有如下数据,我想使用 group bylimit 到 select 每个艺术家前 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 都很好

table 姓名: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 |  

顺便说一句,Whosebug 的编辑器不支持 table of markdown??

您可以将相关子查询与聚合一起使用:

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

如果您是运行支持window函数的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