如何使用 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 by
和limit
来选择每个艺术家前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 BY
和LIMIT
?
【参考方案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 中”