如何使用 sql group by 选择前 2 项并对一个字段求​​和?

Posted

技术标签:

【中文标题】如何使用 sql group by 选择前 2 项并对一个字段求​​和?【英文标题】:How to use sql group by to select top 2 items and sum one field? 【发布时间】:2020-04-26 03:52:35 【问题描述】:

例如,我有下面这样的数据,我想用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 |  

对了,***的编辑器不支持markdown表??

【问题讨论】:

请用您正在使用的数据库标记您的问题。 MySQL 版本?? sqlite 版本? 为什么是GROUP BYLIMIT 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何使用 sql group by 选择前 2 项并对一个字段求​​和?的主要内容,如果未能解决你的问题,请参考以下文章

Postres SQL 使用 GROUP BY 和 COUNT 选择

使用 group by 和 like 语句时如何让 SQL 使用 where 条件

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

SQL语句 group by子句后的分组项如果有多个是怎样进行分组的

在 SQL 中选择不在 Group By 中的列

在SQL中分组查询 Group by 的存在条件是啥